diff --git a/study/process/pid/PID命名空间.png b/study/process/pid/PID命名空间.png deleted file mode 100644 index 228b3b6..0000000 Binary files a/study/process/pid/PID命名空间.png and /dev/null differ diff --git a/study/process/pid/pid.md b/study/process/pid/pid.md deleted file mode 100644 index 7d814c4..0000000 --- a/study/process/pid/pid.md +++ /dev/null @@ -1,645 +0,0 @@ -Linux 鍐呮牳浣跨敤 task_struct 鏁版嵁缁撴瀯鏉ュ叧鑱旀墍鏈変笌杩涚▼鏈夊叧鐨勬暟鎹拰缁撴瀯锛孡inux 鍐呮牳鎵鏈夋秹鍙婂埌杩涚▼鍜岀▼搴忕殑鎵鏈夌畻娉曢兘鏄洿缁曡鏁版嵁缁撴瀯寤虹珛鐨勶紝鏄唴鏍镐腑鏈閲嶈鐨勬暟鎹粨鏋勪箣涓銆 - -璇ユ暟鎹粨鏋勫湪鍐呮牳鏂囦欢[include/linux/sched.h](http://lxr.free-electrons.com/source/include/linux/sched.h#L1389)涓畾涔夛紝鍦ㄧ洰鍓嶆渶鏂扮殑Linux-4.5锛堟埅鑷崇洰鍓嶇殑鏃ユ湡涓2016-05-11锛夌殑鍐呮牳涓紝璇ユ暟鎹粨鏋勮冻瓒虫湁 380 琛屼箣澶氾紝鍦ㄨ繖閲屾垜涓嶅彲鑳介愰」鍘绘弿杩板叾琛ㄧず鐨勫惈涔夛紝鏈瘒鏂囩珷鍙叧娉ㄨ鏁版嵁缁撴瀯濡備綍鏉ョ粍缁囧拰绠$悊杩涚▼ID鐨勩 - -#杩涚▼ID姒傝堪 -------- - -##杩涚▼ID绫诲瀷 -------- - -瑕佹兂浜嗚В鍐呮牳濡備綍鏉ョ粍缁囧拰绠$悊杩涚▼ID锛屽厛瑕佺煡閬撹繘绋婭D鐨勭被鍨嬶細 - -鍐呮牳涓繘绋婭D鐨勭被鍨嬬敤[pid_type](http://lxr.free-electrons.com/source/include/linux/pid.h#L6)鏉ユ弿杩,瀹冭瀹氫箟鍦╗include/linux/pid.h](http://lxr.free-electrons.com/source/include/linux/pid.h)涓 - -```c -enum pid_type -{ - PIDTYPE_PID, - PIDTYPE_PGID, - PIDTYPE_SID, - PIDTYPE_MAX -}; -``` - -* **PID** 鍐呮牳鍞竴鍖哄垎姣忎釜杩涚▼鐨勬爣璇 - - -pid鏄 Linux 涓湪鍏跺懡鍚嶇┖闂翠腑鍞竴鏍囪瘑杩涚▼鑰屽垎閰嶇粰瀹冪殑涓涓彿鐮侊紝绉板仛杩涚▼ID鍙凤紝绠绉癙ID銆傚湪浣跨敤 fork 鎴 clone 绯荤粺璋冪敤鏃朵骇鐢熺殑杩涚▼鍧囦細鐢卞唴鏍稿垎閰嶄竴涓柊鐨勫敮涓鐨凱ID鍊 - - -杩欎釜pid鐢ㄤ簬鍐呮牳鍞竴鐨勫尯鍒嗘瘡涓繘绋 - ->娉ㄦ剰瀹冨苟涓嶆槸鎴戜滑鐢ㄦ埛绌洪棿閫氳繃getpid( )鎵鑾峰彇鍒扮殑閭d釜杩涚▼鍙凤紝鑷充簬鍘熷洜涔堬紝鎺ョ潃寰涓嬬湅 - -* **TGID** 绾跨▼缁勶紙杞婚噺绾ц繘绋嬬粍锛夌殑ID鏍囪瘑 - -鍦ㄤ竴涓繘绋嬩腑锛屽鏋滀互CLONE_THREAD鏍囧織鏉ヨ皟鐢╟lone寤虹珛鐨勮繘绋嬪氨鏄杩涚▼鐨勪竴涓嚎绋嬶紙鍗宠交閲忕骇杩涚▼锛孡inux鍏跺疄娌℃湁涓ユ牸鐨勮繘绋嬫蹇碉級锛屽畠浠浜庝竴涓嚎绋嬬粍锛 - - -璇ョ嚎绋嬬粍鐨勬墍鏈夌嚎绋嬬殑ID鍙仛TGID銆傚浜庣浉鍚岀殑绾跨▼缁勪腑鐨勬墍鏈夎繘绋嬮兘鏈夌浉鍚岀殑TGID锛屼絾鏄敱浜庝粬浠槸涓嶅悓鐨勮繘绋嬶紝鍥犳鍏秔id鍚勪笉鐩稿悓锛涚嚎绋嬬粍缁勯暱锛堜篃鍙富绾跨▼锛夌殑TGID涓庡叾PID鐩稿悓锛涗竴涓繘绋嬫病鏈変娇鐢ㄧ嚎绋嬶紝鍒欏叾TGID涓嶱ID涔熺浉鍚屻 - - -* **PGID** - -鍙﹀锛鐙珛鐨勮繘绋嬪彲浠ョ粍鎴愯繘绋嬬粍锛堜娇鐢╯etpgrp绯荤粺璋冪敤锛夛紝杩涚▼缁勫彲浠ョ畝鍖栧悜鎵鏈夌粍鍐呰繘绋嬪彂閫佷俊鍙风殑鎿嶄綔 - -渚嬪鐢ㄧ閬撹繛鎺ョ殑杩涚▼澶勫湪鍚屼竴杩涚▼缁勫唴銆傝繘绋嬬粍ID鍙仛PGID锛岃繘绋嬬粍鍐呯殑鎵鏈夎繘绋嬮兘鏈夌浉鍚岀殑PGID锛岀瓑浜庤缁勭粍闀跨殑PID銆 - -* **SID** - -鍑犱釜杩涚▼缁勫彲浠ュ悎骞舵垚涓涓細璇濈粍锛堜娇鐢╯etsid绯荤粺璋冪敤锛夛紝鍙互鐢ㄤ簬缁堢绋嬪簭璁捐銆備細璇濈粍涓墍鏈夎繘绋嬮兘鏈夌浉鍚岀殑SID,淇濆瓨鍦╰ask_struct鐨剆ession鎴愬憳涓 - - -##PID鍛藉悕绌洪棿 -------- - -###pid鍛藉悕绌洪棿姒傝堪 -------- - -鍛藉悕绌洪棿鏄负鎿嶄綔绯荤粺灞傞潰鐨勮櫄鎷熷寲鏈哄埗鎻愪緵鏀拺锛岀洰鍓嶅疄鐜扮殑鏈夊叚绉嶄笉鍚岀殑鍛藉悕绌洪棿锛屽垎鍒负mount鍛藉悕绌洪棿銆乁TS鍛藉悕绌洪棿銆両PC鍛藉悕绌洪棿銆佺敤鎴峰懡鍚嶇┖闂淬丳ID鍛藉悕绌洪棿銆佺綉缁滃懡鍚嶇┖闂淬傚懡鍚嶇┖闂寸畝鍗曟潵璇存彁渚涚殑鏄鍏ㄥ眬璧勬簮鐨勪竴绉嶆娊璞★紝灏嗚祫婧愭斁鍒颁笉鍚岀殑瀹瑰櫒涓紙涓嶅悓鐨勫懡鍚嶇┖闂达級锛屽悇瀹瑰櫒褰兼闅旂銆 - ->鍏充簬鍛藉悕绌洪棿鐨勮缁嗕俊鎭紝璇峰弬瑙 - -鍛藉悕绌洪棿鏈夌殑杩樻湁灞傛鍏崇郴锛屽PID鍛藉悕绌洪棿 - -![鍛藉悕绌洪棿鐨勫眰娆″叧绯诲浘](./鍛藉悕绌洪棿鐨勫眰娆″叧绯诲浘.jpg) - - - - ->鍦ㄤ笂鍥炬湁鍥涗釜鍛藉悕绌洪棿锛屼竴涓埗鍛藉悕绌洪棿琛嶇敓浜嗕袱涓瓙鍛藉悕绌洪棿锛屽叾涓殑涓涓瓙鍛藉悕绌洪棿鍙堣鐢熶簡涓涓瓙鍛藉悕绌洪棿銆備互PID鍛藉悕绌洪棿涓轰緥锛岀敱浜庡悇涓懡鍚嶇┖闂村郊姝ら殧绂伙紝鎵浠ユ瘡涓懡鍚嶇┖闂撮兘鍙互鏈 PID 鍙蜂负 1 鐨勮繘绋嬶紱浣嗗張鐢变簬鍛藉悕绌洪棿鐨勫眰娆℃э紝鐖跺懡鍚嶇┖闂存槸鐭ラ亾瀛愬懡鍚嶇┖闂寸殑瀛樺湪锛屽洜姝ゅ瓙鍛藉悕绌洪棿瑕佹槧灏勫埌鐖跺懡鍚嶇┖闂翠腑鍘伙紝鍥犳涓婂浘涓 level 1 涓袱涓瓙鍛藉悕绌洪棿鐨勫叚涓繘绋嬪垎鍒槧灏勫埌鍏剁埗鍛藉悕绌洪棿鐨凱ID 鍙5~10銆 - -###灞閮↖D鍜屽叏灞ID -------- - - -鍛藉悕绌洪棿澧炲姞浜哖ID绠$悊鐨勫鏉傛с - - -鍥炴兂涓涓嬶紝PID鍛藉悕绌洪棿鎸夊眰娆$粍缁囥傚湪寤虹珛涓涓柊鐨勫懡鍚嶇┖闂存椂锛岃鍛藉悕绌洪棿涓殑鎵鏈塒ID瀵圭埗鍛藉悕绌洪棿閮芥槸鍙鐨勶紝浣嗗瓙鍛藉悕绌洪棿鏃犳硶鐪嬪埌鐖跺懡鍚嶇┖闂寸殑PID銆備絾杩欐剰鍛崇潃鏌愪簺杩涚▼鍏锋湁澶氫釜PID锛屽嚒鍙互鐪嬪埌璇ヨ繘绋嬬殑鍛藉悕绌洪棿锛岄兘浼氫负鍏跺垎閰嶄竴涓狿ID銆 杩欏繀椤诲弽鏄犲湪鏁版嵁缁撴瀯涓傛垜浠繀椤诲尯鍒**灞閮↖D**鍜**鍏ㄥ眬ID** - - - -鍏ㄥ眬PID鍜孴GID鐩存帴淇濆瓨鍦╗`task_struct`](http://lxr.free-electrons.com/source/include/linux/sched.h#L1389)涓紝鍒嗗埆鏄痶ask_struct鐨刞pid`鍜宍tgid`鎴愬憳锛 - - -* **鍏ㄥ眬ID** 鍦ㄥ唴鏍告湰韬拰鍒濆鍛藉悕绌洪棿涓敮涓鐨処D锛屽湪绯荤粺鍚姩鏈熼棿寮濮嬬殑 init 杩涚▼鍗冲睘浜庤鍒濆鍛藉悕绌洪棿銆傜郴缁熶腑姣忎釜杩涚▼閮藉搴斾簡璇ュ懡鍚嶇┖闂寸殑涓涓狿ID锛屽彨鍏ㄥ眬ID锛屼繚璇佸湪鏁翠釜绯荤粺涓敮涓銆 - -* **灞閮↖D** 瀵逛簬灞炰簬鏌愪釜鐗瑰畾鐨勫懡鍚嶇┖闂达紝瀹冨湪鍏跺懡鍚嶇┖闂村唴鍒嗛厤鐨処D涓哄眬閮↖D锛岃ID涔熷彲浠ュ嚭鐜板湪鍏朵粬鐨勫懡鍚嶇┖闂翠腑銆 - -```c - -struct task_struct -{ - //... - pid_t pid; - pid_t tgid; - //... -} -``` - -涓ら」閮芥槸pid_t绫诲瀷锛岃绫诲瀷瀹氫箟涓篲_kernel_pid_t锛屽悗鑰呯敱鍚勪釜浣撶郴缁撴瀯鍒嗗埆瀹氫箟銆傞氬父瀹氫箟涓篿nt锛屽嵆鍙互鍚屾椂浣跨敤232涓笉鍚岀殑ID銆 - -浼氳瘽session鍜岃繘绋媑roup缁処D涓嶆槸鐩存帴鍖呭惈鍦╰ask_struct鏈韩涓紝浣嗕繚瀛樺湪鐢ㄤ簬淇″彿澶勭悊鐨勭粨鏋勪腑銆 - - - ->task_ struct->signal->__session琛ㄧず鍏ㄥ眬SID锛 -> ->鑰屽叏灞PGID鍒欎繚瀛樺湪task_struct->signal->__pgrp銆 -> ->杈呭姪鍑芥暟set_task_session鍜宻et_task_pgrp鍙敤浜庝慨鏀硅繖浜涘笺 - - -闄や簡杩欎袱涓瓧娈典箣澶栵紝鍐呮牳杩橀渶瑕佹壘涓涓姙娉曟潵绠$悊鎵鏈夊懡鍚嶇┖闂村唴閮ㄧ殑灞閮ㄩ噺锛屼互鍙婂叾浠朓D锛堝TID鍜孲ID锛夈傝繖闇瑕佸嚑涓浉浜掕繛鎺ョ殑鏁版嵁缁撴瀯锛屼互鍙婅澶氳緟鍔╁嚱鏁帮紝骞跺皢鍦ㄤ笅鏂囪璁恒 - -涓嬫枃鎴戝皢浣跨敤ID鎸囦唬鎻愬埌鐨勪换浣曡繘绋婭D銆傚湪蹇呰鐨勬儏鍐典笅锛屾垜浼氭槑纭湴璇存槑ID绫诲瀷锛堜緥濡傦紝TGID锛屽嵆绾跨▼缁処D锛夈 - -涓涓皬鍨嬬殑瀛愮郴缁熺О涔嬩负PID鍒嗛厤鍣紙pid allocator锛夌敤浜庡姞閫熸柊ID鐨勫垎閰嶃傛澶栵紝鍐呮牳闇瑕佹彁渚涜緟鍔╁嚱鏁帮紝浠ュ疄鐜伴氳繃ID鍙婂叾绫诲瀷鏌ユ壘杩涚▼鐨則ask_struct鐨勫姛鑳斤紝浠ュ強灏咺D鐨勫唴鏍歌〃绀哄舰寮忓拰鐢ㄦ埛绌洪棿鍙鐨勬暟鍊艰繘琛岃浆鎹㈢殑鍔熻兘銆 - - - -###PID鍛藉悕绌洪棿鏁版嵁缁撴瀯pid_namespace - -------- - - - -鍦ㄤ粙缁嶈〃绀篒D鏈韩鎵闇鐨勬暟鎹粨鏋勪箣鍓嶏紝鎴戦渶瑕佽璁篜ID鍛藉悕绌洪棿鐨勮〃绀烘柟寮忋傛垜浠墍闇鏌ョ湅鐨勪唬鐮佸涓嬫墍绀猴細 - -[pid_namespace](http://lxr.free-electrons.com/source/include/linux/pid_namespace.h#L24)鐨勫畾涔夊湪[include/linux/pid_namespace.h](http://lxr.free-electrons.com/source/include/linux/pid_namespace.h#L24)涓 - -鍛藉悕绌洪棿鐨勭粨鏋勫涓 - -```c -struct pid_namespace -{ - - struct kref kref; - struct pidmap pidmap[PIDMAP_ENTRIES]; - int last_pid; - struct task_struct *child_reaper; - struct kmem_cache *pid_cachep; - unsigned int level; - struct pid_namespace *parent; -}; -``` - ->鎴戜滑杩欓噷鍙叧蹇冨叾涓殑child_reaper锛宭evel鍜宲arent杩欎笁涓瓧娈 - - -| 瀛楁| 鎻忚堪 | -| ------------- |:-------------:| -| kref | 琛ㄧず鎸囧悜pid_namespace鐨勪釜鏁 | -| pidmap | pidmap缁撴瀯浣撹〃绀哄垎閰峱id鐨勪綅鍥俱傚綋闇瑕佸垎閰嶄竴涓柊鐨刾id鏃跺彧闇鏌ユ壘浣嶅浘锛屾壘鍒癰it涓0鐨勪綅缃苟缃1锛岀劧鍚庢洿鏂扮粺璁℃暟鎹煙锛坣r_free) | -| last_pid | 鐢ㄤ簬pidmap鐨勫垎閰嶃傛寚鍚戞渶鍚庝竴涓垎閰嶇殑pid鐨勪綅缃(涓嶆槸鐗瑰埆纭畾锛墊 -| child_reaper | 鎸囧悜鐨勬槸褰撳墠鍛藉悕绌洪棿鐨刬nit杩涚▼锛屾瘡涓懡鍚嶇┖闂撮兘鏈変竴涓綔鐢ㄧ浉褰撲簬鍏ㄥ眬init杩涚▼鐨勮繘绋 | -| pid_cachep | 鍩熸寚鍚戝垎閰峱id鐨剆lab鐨勫湴鍧銆倈 -| level | 浠h〃褰撳墠鍛藉悕绌洪棿鐨勭瓑绾э紝鍒濆鍛藉悕绌洪棿鐨刲evel涓0锛屽畠鐨勫瓙鍛藉悕绌洪棿level涓1锛屼緷娆¢掑锛岃屼笖瀛愬懡鍚嶇┖闂村鐖跺懡鍚嶇┖闂存槸鍙鐨勩備粠缁欏畾鐨刲evel璁剧疆锛屽唴鏍稿嵆鍙帹鏂繘绋嬩細鍏宠仈鍒板灏戜釜ID銆倈 -| parent | 鎸囧悜鐖跺懡鍚嶇┖闂寸殑鎸囬拡 | - -![PID鍛藉悕绌洪棿.png](./PID鍛藉悕绌洪棿.png) - - -瀹為檯涓奝ID鍒嗛厤鍣ㄤ篃闇瑕佷緷闈犺缁撴瀯鐨勬煇浜涢儴鍒嗘潵杩炵画鐢熸垚鍞竴ID锛屼絾鎴戜滑鐩墠瀵规鏃犻渶鍏虫敞銆傛垜浠笂杩颁唬鐮佷腑缁欏嚭鐨勪笅鍒楁垚鍛樻洿鎰熷叴瓒c - -姣忎釜PID鍛藉悕绌洪棿閮藉叿鏈変竴涓繘绋嬶紝鍏跺彂鎸ョ殑浣滅敤鐩稿綋浜庡叏灞鐨刬nit杩涚▼銆俰nit鐨勪竴涓洰鐨勬槸瀵瑰鍎胯繘绋嬭皟鐢╳ait4锛屽懡鍚嶇┖闂村眬閮ㄧ殑init鍙樹綋涔熷繀椤诲畬鎴愯宸ヤ綔銆 - -#pid缁撴瀯鎻忚堪 -------- - - -##pid涓巙pid -------- - -PID鐨勭鐞嗗洿缁曚袱涓暟鎹粨鏋勫睍寮锛 - -* [struct pid](http://lxr.free-electrons.com/source/include/linux/pid.h#L57)鏄唴鏍稿PID鐨勫唴閮ㄨ〃绀猴紝 - -* [struct upid](http://lxr.free-electrons.com/source/include/linux/pid.h#L50)鍒欒〃绀虹壒瀹氱殑鍛藉悕绌洪棿涓彲瑙佺殑淇℃伅銆 - - - -涓や釜缁撴瀯鐨勫畾涔夊湪[include/linux/pid.h](include/linux/pid.h)涓 - - - -```c -struct upid -{ - /* Try to keep pid_chain in the same cacheline as nr for find_vpid */ - int nr; - struct pid_namespace *ns; - struct hlist_node pid_chain; -}; -``` - -| 瀛楁| 鎻忚堪 | -| ------------- |:-------------:| -| nr | 琛ㄧずID鍏蜂綋鐨勫 | -| ns | 鎸囧悜鍛藉悕绌洪棿鐨勬寚閽 | -| pid_chain | 鎸囧悜PID鍝堝笇鍒楄〃鐨勬寚閽堬紝鐢ㄤ簬鍏宠仈瀵逛簬鐨凱ID | - - ->鎵鏈夌殑upid瀹炰緥閮戒繚瀛樺湪涓涓暎鍒楄〃涓紝绋嶅悗鎴戜滑浼氱湅鍒拌缁撴瀯銆 - -```c -struct pid -{ - atomic_t count; - /* 浣跨敤璇id鐨勮繘绋嬬殑鍒楄〃锛 lists of tasks that use this pid */ - struct hlist_head tasks[PIDTYPE_MAX]; - int level; - struct upid numbers[1]; -}; -``` - -| 瀛楁| 鎻忚堪 | -| ------------- |:-------------:| -| count | 鏄寚浣跨敤璇ID鐨則ask鐨勬暟鐩紱| -| level | 琛ㄧず鍙互鐪嬪埌璇ID鐨勫懡鍚嶇┖闂寸殑鏁扮洰锛屼篃灏辨槸鍖呭惈璇ヨ繘绋嬬殑鍛藉悕绌洪棿鐨勬繁搴 | -| tasks[PIDTYPE_MAX] | 鏄竴涓暟缁勶紝姣忎釜鏁扮粍椤归兘鏄竴涓暎鍒楄〃澶,鍒嗗埆瀵瑰簲浠ヤ笅涓夌绫诲瀷 -| numbers[1] | 涓涓猽pid鐨勫疄渚嬫暟缁勶紝姣忎釜鏁扮粍椤逛唬琛ㄤ竴涓懡鍚嶇┖闂达紝鐢ㄦ潵琛ㄧず涓涓狿ID鍙互灞炰簬涓嶅悓鐨勫懡鍚嶇┖闂达紝璇ュ厓绱犳斁鍦ㄦ湯灏撅紝鍙互鍚戞暟缁勬坊鍔犻檮鍔犵殑椤广倈 - ->tasks鏄竴涓暟缁勶紝姣忎釜鏁扮粍椤归兘鏄竴涓暎鍒楄〃澶达紝瀵瑰簲浜庝竴涓狪D绫诲瀷,PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID锛 PIDTYPE_MAX琛ㄧずID绫诲瀷鐨勬暟鐩級杩欐牱鍋氭槸蹇呰鐨勶紝鍥犱负涓涓狪D鍙兘鐢ㄤ簬鍑犱釜杩涚▼銆傛墍鏈夊叡浜悓涓缁欏畾ID鐨則ask_struct瀹炰緥锛岄兘閫氳繃璇ュ垪琛ㄨ繛鎺ヨ捣鏉ャ -> ->杩欎釜鏋氫妇甯搁噺PIDTYPE_MAX锛屾濂芥槸pid_type绫诲瀷鐨勬暟鐩紝杩欓噷linux鍐呮牳浣跨敤浜嗕竴涓皬鎶宸ф潵鐢辩紪璇戝櫒鏉ヨ嚜鍔ㄧ敓鎴恑d绫诲瀷鐨勬暟鐩 - - - -姝ゅ锛岃繕鏈変袱涓粨鏋勬垜浠渶瑕佽鏄庯紝灏辨槸pidmap鍜宲id_link - -* pidmap褰撻渶瑕佸垎閰嶄竴涓柊鐨刾id鏃舵煡鎵惧彲浣跨敤pid鐨勪綅鍥撅紝鍏跺畾涔夊涓 - -* 鑰宲id_link鍒欐槸pid鐨勫搱甯岃〃瀛樺偍缁撴瀯 - -##pidmap鐢ㄤ簬鍒嗛厤pid鐨勪綅鍥 -------- - -```c -struct pidmap -{ - atomic_t nr_free; - void *page; -}; -``` - -| 瀛楁| 鎻忚堪 | -| ------------- |:-------------:| -| nr_free | 琛ㄧず杩樿兘鍒嗛厤鐨刾id鐨勬暟閲 | -| page | 鎸囧悜鐨勬槸瀛樻斁pid鐨勭墿鐞嗛〉 | - - - ->pidmap[PIDMAP_ENTRIES]鍩熻〃绀鸿pid_namespace涓媝id宸插垎閰嶆儏鍐 - -##pid_link鍝堝笇琛ㄥ瓨鍌 -------- - -pids[PIDTYPE_MAX]鎸囧悜浜嗗拰璇ask_struct鐩稿叧鐨刾id缁撴瀯浣撱 -pid_link鐨勫畾涔夊涓 -```c -struct pid_link -{ -struct hlist_node node; -struct pid *pid; -}; -``` - - - -##task_struct涓繘绋婭D鐩稿叧鏁版嵁缁撴瀯 -------- - -##task_struct涓殑鎻忚堪绗︿俊鎭 -------- -```c -struct task_struct -{ - //... - pid_t pid; - pid_t tgid; - struct task_struct *group_leader; - struct pid_link pids[PIDTYPE_MAX]; - struct nsproxy *nsproxy; - //... -}; -``` -| 瀛楁| 鎻忚堪 | -| ------------- |:-------------:| -| pid | 鎸囪杩涚▼鐨勮繘绋嬫弿杩扮銆傚湪fork鍑芥暟涓鍏惰繘琛岃祴鍊肩殑 | -| tgid | 鎸囪杩涚▼鐨勭嚎绋嬫弿杩扮銆傚湪linux鍐呮牳涓绾跨▼骞舵病鏈夊仛鐗规畩鐨勫鐞嗭紝杩樻槸鐢眛ask_struct鏉ョ鐞嗐傛墍浠ヤ粠鍐呮牳鐨勮搴︾湅锛 鐢ㄦ埛鎬佺殑绾跨▼鏈川涓婅繕鏄竴涓繘绋嬨傚浜庡悓涓涓繘绋嬶紙鐢ㄦ埛鎬佽搴︼級涓笉鍚岀殑绾跨▼鍏秚gid鏄浉鍚岀殑锛屼絾鏄痯id鍚勪笉鐩稿悓銆 涓荤嚎绋嬪嵆group_leader锛堜富绾跨▼浼氬垱寤哄叾浠栨墍鏈夌殑瀛愮嚎绋嬶級銆傚鏋滄槸鍗曠嚎绋嬭繘绋嬶紙鐢ㄦ埛鎬佽搴︼級锛屽畠鐨刾id绛変簬tgid銆倈 -| group_leader | 闄や簡鍦ㄥ绾跨▼鐨勬ā寮忎笅鎸囧悜涓荤嚎绋嬶紝杩樻湁涓涓敤澶勶紝 褰撲竴浜涜繘绋嬬粍鎴愪竴涓兢缁勬椂锛圥IDTYPE_PGID)锛 璇ュ煙鎸囧悜璇ョ兢缁勭殑leader | -| nsproxy | 鎸囬拡鎸囧悜namespace鐩稿叧鐨勫煙锛岄氳繃nsproxy鍩熷彲浠ョ煡閬撹task_struct灞炰簬鍝釜pid_namespace | - ->瀵逛簬鐢ㄦ埛鎬佺▼搴忔潵璇达紝璋冪敤getpid锛堬級鍑芥暟鍏跺疄杩斿洖鐨勬槸tgid锛屽洜姝ょ嚎绋嬬粍涓殑杩涚▼id搴旇鏄槸涓鑷寸殑锛屼絾鏄粬浠琾id涓嶄竴鑷达紝杩欎篃鏄唴鏍稿尯鍒嗕粬浠殑鏍囪瘑 - - - -1. 澶氫釜task_struct鍙互鍏辩敤涓涓狿ID - -2. 涓涓狿ID鍙互灞炰簬涓嶅悓鐨勫懡鍚嶇┖闂 - -3. 褰撻渶瑕佸垎閰嶄竴涓柊鐨刾id鏃跺欙紝鍙渶瑕佹煡鎵緋idmap浣嶅浘鍗冲彲 -4. -閭d箞鏈缁堬紝linux涓嬭繘绋嬪懡鍚嶇┖闂村拰杩涚▼鐨勫叧绯荤粨鏋勫涓嬶細 - -![杩涚▼鍛藉悕绌洪棿鍜岃繘绋嬬殑鍏崇郴缁撴瀯](./杩涚▼鍛藉悕绌洪棿鍜岃繘绋嬬殑鍏崇郴缁撴瀯.png) -鍙互鐪嬪埌锛屽涓猼ask_struct鎸囧悜涓涓狿ID锛屽悓鏃禤ID鐨刪ash鏁扮粍閲屽畨瑁呬笉鍚岀殑绫诲瀷瀵箃ask杩涜鏁e垪锛屽苟涓斾竴涓狿ID浼氬睘浜庡涓懡鍚嶇┖闂淬 - - - -#鍐呮牳鏄浣曡璁ask_struct涓繘绋婭D鐩稿叧鏁版嵁缁撴瀯鐨 -------- - ->鏈儴鍐呭杈冨鐨勯噰鐢ㄤ簡[Linux 鍐呮牳杩涚▼绠$悊涔嬭繘绋婭D](http://www.cnblogs.com/hazir/p/linux_kernel_pid.html) - -Linux 鍐呮牳鍦ㄨ璁$鐞咺D鐨勬暟鎹粨鏋勬椂锛岃鍏呭垎鑰冭檻浠ヤ笅鍥犵礌锛 - -1. 濡備綍蹇熷湴鏍规嵁杩涚▼鐨 task_struct銆両D绫诲瀷銆佸懡鍚嶇┖闂存壘鍒板眬閮↖D - -2. 濡備綍蹇熷湴鏍规嵁灞閮↖D銆佸懡鍚嶇┖闂淬両D绫诲瀷鎵惧埌瀵瑰簲杩涚▼鐨 task_struct - -3. 濡備綍蹇熷湴缁欐柊杩涚▼鍦ㄥ彲瑙佺殑鍛藉悕绌洪棿鍐呭垎閰嶄竴涓敮涓鐨 PID - -濡傛灉灏嗘墍鏈夊洜绱犺冭檻鍒颁竴璧凤紝灏嗕細寰堝鏉傦紝涓嬮潰灏嗕細鐢辩畝鍒扮箒璁捐璇ョ粨鏋勩 - -##涓涓狿ID瀵瑰簲涓涓猼ask鏃剁殑task_struct璁捐 -------- - -涓涓狿ID瀵瑰簲涓涓猔task_struct`濡傛灉鍏堜笉鑰冭檻杩涚▼涔嬮棿鐨勫叧绯伙紝涓嶈冭檻鍛藉悕绌洪棿锛屼粎浠呮槸涓涓狿ID鍙峰搴斾竴涓猔task_struct`锛岄偅涔堟垜浠彲浠ヨ璁¤繖鏍风殑鏁版嵁缁撴瀯 - -```c -struct task_struct -{ - //... - struct pid_link pids; - //... -}; - -struct pid_link -{ - struct hlist_node node; - struct pid *pid; -}; - -struct pid -{ - struct hlist_head tasks; //鎸囧洖 pid_link 鐨 node - int nr; //PID - struct hlist_node pid_chain; //pid hash 鏁e垪琛ㄧ粨鐐 -}; -``` -姣忎釜杩涚▼鐨 task_struct 缁撴瀯浣撲腑鏈変竴涓寚鍚 pid 缁撴瀯浣撶殑鎸囬拡锛宲id缁撴瀯浣撳寘鍚簡PID鍙枫 - -缁撴瀯绀烘剰鍥惧鍥 - -![涓涓猼ask_struct瀵瑰簲涓涓狿ID](./涓涓猼ask_struct瀵瑰簲涓涓狿ID.png) - - -#濡備綍蹇熷湴鏍规嵁灞閮↖D銆佸懡鍚嶇┖闂淬両D绫诲瀷鎵惧埌瀵瑰簲杩涚▼鐨 task_struct -------- -鍥句腑杩樻湁涓や釜缁撴瀯涓婇潰鏈彁鍙婏細 - ->* pid_hash[] -> ->杩欐槸涓涓猦ash琛ㄧ殑缁撴瀯锛屾牴鎹畃id鐨刵r鍊煎搱甯屽埌鍏舵煇涓〃椤癸紝鑻ユ湁澶氫釜 pid 缁撴瀯瀵瑰簲鍒板悓涓涓〃椤癸紝杩欓噷瑙e喅鍐茬獊浣跨敤鐨勬槸鏁e垪琛ㄦ硶銆 - -杩欐牱锛屽氨鑳借В鍐冲紑濮嬫彁鍑虹殑绗2涓棶棰樹簡锛屾牴鎹甈ID鍊兼庢牱蹇熷湴鎵惧埌task_struct缁撴瀯浣擄細 - -1. 棣栧厛閫氳繃 PID 璁$畻 pid 鎸傛帴鍒板搱甯岃〃 pid_hash[] 鐨勮〃椤 - -2. 閬嶅巻璇ヨ〃椤癸紝鎵惧埌 pid 缁撴瀯浣撲腑 nr 鍊间笌 PID 鍊肩浉鍚岀殑閭d釜 pid - -3. 鍐嶉氳繃璇 pid 缁撴瀯浣撶殑 tasks 鎸囬拡鎵惧埌 node - -4. 鏈鍚庢牴鎹唴鏍哥殑 container_of 鏈哄埗灏辫兘鎵惧埌 task_struct 缁撴瀯浣 - -#濡備綍蹇熷湴缁欐柊杩涚▼鍦ㄥ彲瑙佺殑鍛藉悕绌洪棿鍐呭垎閰嶄竴涓敮涓鐨 PID -------- - ->* pid_map -> ->杩欐槸涓涓綅鍥撅紝鐢ㄦ潵鍞竴鍒嗛厤PID鍊肩殑缁撴瀯锛屽浘涓伆鑹茶〃绀哄凡缁忓垎閰嶈繃鐨勫硷紝鍦ㄦ柊寤轰竴涓繘绋嬫椂锛屽彧闇鍦ㄥ叾涓壘鍒颁竴涓负鍒嗛厤杩囩殑鍊艰祴缁 pid 缁撴瀯浣撶殑 nr锛屽啀灏唒id_map 涓鍊艰涓哄凡鍒嗛厤鏍囧織銆傝繖涔熷氨瑙e喅浜嗕笂闈㈢殑**绗3涓棶棰樷斺斿浣曞揩閫熷湴鍒嗛厤涓涓叏灞鐨凱ID** - -鑷充簬涓婇潰鐨**绗1涓棶棰*灏辨洿鍔犵畝鍗曪紝宸茬煡 task_struct 缁撴瀯浣擄紝鏍规嵁鍏 pid_link 鐨 pid 鎸囬拡鎵惧埌 pid 缁撴瀯浣擄紝鍙栧嚭鍏 nr 鍗充负 PID 鍙枫 - -##甯﹁繘绋婭D绫诲瀷鐨則ask_struct璁捐 -------- - -濡傛灉鑰冭檻杩涚▼涔嬮棿鏈夊鏉傜殑鍏崇郴锛屽绾跨▼缁勩佽繘绋嬬粍銆佷細璇濈粍锛岃繖浜涚粍鍧囨湁缁処D锛屽垎鍒负 TGID銆丳GID銆丼ID锛屾墍浠ュ師鏉ョ殑 task_struct 涓璸id_link 鎸囧悜涓涓 pid 缁撴瀯浣撻渶瑕佸鍔犲嚑椤癸紝鐢ㄦ潵鎸囧悜鍒板叾缁勯暱鐨 pid 缁撴瀯浣擄紝鐩稿簲鐨 struct pid 鍘熸湰鍙渶瑕佹寚鍥炲叾 PID 鎵灞炶繘绋嬬殑task_struct锛岀幇鍦ㄨ澧炲姞鍑犻」锛岀敤鏉ラ摼鎺ラ偅浜涗互璇 pid 涓虹粍闀跨殑鎵鏈夎繘绋嬬粍鍐呰繘绋嬨傛暟鎹粨鏋勫涓嬶細 - ->瀹氫箟鍦╤ttp://lxr.free-electrons.com/source/include/linux/sched.h#L1389 - - -```c -enum pid_type -{ - PIDTYPE_PID, - PIDTYPE_PGID, - PIDTYPE_SID, - PIDTYPE_MAX -}; - -struct task_struct -{ - //... - pid_t pid; //PID - pid_t tgid; //thread group id - //.. - struct pid_link pids[PIDTYPE_MAX]; - struct task_struct *group_leader; // threadgroup leader - //... - struct pid_link pids[PIDTYPE_MAX]; - struct nsproxy *nsproxy; -}; - -struct pid_link -{ - struct hlist_node node; - struct pid *pid; -}; - -struct pid -{ - struct hlist_head tasks[PIDTYPE_MAX]; - int nr; //PID - struct hlist_node pid_chain; // pid hash 鏁e垪琛ㄧ粨鐐 -}; -``` - -涓婇潰 ID 鐨勭被鍨 PIDTYPE_MAX 琛ㄧず ID 绫诲瀷鏁扮洰銆備箣鎵浠ヤ笉鍖呮嫭绾跨▼缁処D锛屾槸鍥犱负鍐呮牳涓凡缁忔湁鎸囧悜鍒扮嚎绋嬬粍鐨 task_struct 鎸囬拡 group_leader锛岀嚎绋嬬粍 ID 鏃犻潪灏辨槸 group_leader 鐨凱ID銆 - - -鍋囧鐜板湪鏈変笁涓繘绋婣銆丅銆丆涓哄悓涓涓繘绋嬬粍锛岃繘绋嬬粍闀夸负A锛岃繖鏍风殑缁撴瀯绀烘剰鍥惧鍥 - -![澧炲姞ID绫诲瀷鐨勭粨鏋刔(./澧炲姞ID绫诲瀷鐨勭粨鏋.png) - - - -鍏充簬涓婂浘鏈夊嚑鐐归渶瑕佽鏄庯細 - -鍥句腑鐪佸幓浜 pid_hash 浠ュ強 pid_map 缁撴瀯锛屽洜涓虹涓绉嶆儏鍐电被浼硷紱 - -杩涚▼B鍜孋鐨勮繘绋嬬粍缁勯暱涓篈锛岄偅涔 pids[PIDTYPE_PGID] 鐨 pid 鎸囬拡鎸囧悜杩涚▼A鐨 pid 缁撴瀯浣擄紱 - -杩涚▼A鏄繘绋婤鍜孋鐨勭粍闀匡紝杩涚▼A鐨 pid 缁撴瀯浣撶殑 tasks[PIDTYPE_PGID] 鏄竴涓暎鍒楄〃鐨勫ご锛屽畠灏嗘墍鏈変互璇id 涓虹粍闀跨殑杩涚▼閾炬帴璧锋潵銆 - -鍐嶆鍥為【鏈妭鐨勪笁涓熀鏈棶棰橈紝鍦ㄦ缁撴瀯涓婁篃寰堝ソ鍘诲疄鐜般 - -#杩涗竴姝ュ鍔犺繘绋婸ID鍛藉悕绌洪棿鐨則ask_struct璁捐 -------- - -鑻ュ湪绗簩绉嶆儏褰笅鍐嶅鍔燩ID鍛藉悕绌洪棿 - -涓涓繘绋嬪氨鍙兘鏈夊涓狿ID鍊间簡锛屽洜涓哄湪姣忎竴涓彲瑙佺殑鍛藉悕绌洪棿鍐呴兘浼氬垎閰嶄竴涓狿ID锛岃繖鏍峰氨闇瑕佹敼鍙 pid 鐨勭粨鏋勪簡锛屽涓嬶細 -```c -struct pid -{ - unsigned int level; - /* lists of tasks that use this pid */ - struct hlist_head tasks[PIDTYPE_MAX]; - struct upid numbers[1]; -}; - -struct upid -{ - int nr; - struct pid_namespace *ns; - struct hlist_node pid_chain; -}; -``` - -鍦 pid 缁撴瀯浣撲腑澧炲姞浜嗕竴涓〃绀鸿杩涚▼鎵澶勭殑鍛藉悕绌洪棿鐨勫眰娆evel锛屼互鍙婁竴涓彲鎵╁睍鐨 upid 缁撴瀯浣撱傚浜巗truct upid锛岃〃绀哄湪璇ュ懡鍚嶇┖闂存墍鍒嗛厤鐨勮繘绋嬬殑ID锛宯s鎸囧悜鏄ID鎵灞炵殑鍛藉悕绌洪棿锛宲id_chain 琛ㄧず鍦ㄨ鍛藉悕绌洪棿鐨勬暎鍒楄〃銆 - -涓句緥鏉ヨ锛屽湪level 2 鐨勬煇涓懡鍚嶇┖闂翠笂鏂板缓浜嗕竴涓繘绋嬶紝鍒嗛厤缁欏畠鐨 pid 涓45锛屾槧灏勫埌 level 1 鐨勫懡鍚嶇┖闂达紝鍒嗛厤缁欏畠鐨 pid 涓 134锛涘啀鏄犲皠鍒 level 0 鐨勫懡鍚嶇┖闂达紝鍒嗛厤缁欏畠鐨 pid 涓289锛屽浜庤繖鏍风殑渚嬪瓙锛屽鍥4鎵绀轰负鍏惰〃绀猴細 - - -![澧炲姞PID鍛藉悕绌洪棿涔嬪悗鐨勭粨鏋勫浘](./澧炲姞PID鍛藉悕绌洪棿涔嬪悗鐨勭粨鏋勫浘.png) - - -鍥句腑鍏充簬濡傛灉鍒嗛厤鍞竴鐨 PID 娌℃湁鐢诲嚭锛屼絾涔熸槸姣旇緝绠鍗曪紝涓庡墠闈袱绉嶆儏褰笉鍚岀殑鏄紝杩欓噷鍒嗛厤鍞竴鐨 PID 鏄湁鍛藉悕绌洪棿鐨勫鍣ㄧ殑锛屽湪PID鍛藉悕绌洪棿鍐呭繀椤诲敮涓锛屼絾鍚勪釜鍛藉悕绌洪棿涔嬮棿涓嶉渶瑕佸敮涓銆 -鑷虫锛屽凡缁忎笌 Linux 鍐呮牳涓暟鎹粨鏋勭浉宸笉澶氫簡銆 - -#杩涚▼ID绠$悊鍑芥暟 -------- - -鏈変簡涓婇潰鐨勫鏉傜殑鏁版嵁缁撴瀯锛屽啀鍔犱笂鏁e垪琛ㄧ瓑鏁版嵁缁撴瀯鐨勬搷浣滐紝灏卞彲浠ュ啓鍑烘垜浠墠闈㈡墍鎻愬埌鐨勪笁涓棶棰樼殑鍑芥暟浜嗭細 - -##鑾峰緱灞閮↖D -------- - -鏍规嵁杩涚▼鐨 task_struct銆両D绫诲瀷銆佸懡鍚嶇┖闂达紝鍙互寰堝鏄撹幏寰楀叾鍦ㄥ懡鍚嶇┖闂村唴鐨勫眬閮↖D - -鑾峰緱涓巘ask_struct 鍏宠仈鐨刾id缁撴瀯浣撱傝緟鍔╁嚱鏁版湁 task_pid銆乼ask_tgid銆乼ask_pgrp鍜宼ask_session锛屽垎鍒敤鏉ヨ幏鍙栦笉鍚岀被鍨嬬殑ID鐨刾id 瀹炰緥锛屽鑾峰彇 PID 鐨勫疄渚嬶細 - -```c -static inline struct pid *task_pid(struct task_struct *task) -{ - return task->pids[PIDTYPE_PID].pid; -} -``` - -鑾峰彇绾跨▼缁勭殑ID锛屽墠闈篃璇磋繃锛孴GID涓嶈繃鏄嚎绋嬬粍缁勯暱鐨凱ID鑰屽凡锛屾墍浠ワ細 -``` -static inline struct pid *task_tgid(struct task_struct *task) -{ - return task->group_leader->pids[PIDTYPE_PID].pid; -} -``` - -鑰岃幏寰桺GID鍜孲ID锛岄鍏堥渶瑕佹壘鍒拌绾跨▼缁勭粍闀跨殑task_struct锛屽啀鑾峰緱鍏剁浉搴旂殑 pid锛 - -```c -static inline struct pid *task_pgrp(struct task_struct *task) -{ - return task->group_leader->pids[PIDTYPE_PGID].pid; -} - -static inline struct pid *task_session(struct task_struct *task) -{ - return task->group_leader->pids[PIDTYPE_SID].pid; -} -``` - -鑾峰緱 pid 瀹炰緥涔嬪悗锛屽啀鏍规嵁 pid 涓殑numbers 鏁扮粍涓 uid 淇℃伅锛岃幏寰楀眬閮≒ID銆 - - -```c -pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns) -{ - struct upid *upid; - pid_t nr = 0; - if (pid && ns->level <= pid->level) - { - upid = &pid->numbers[ns->level]; - if (upid->ns == ns) - nr = upid->nr; - } - return nr; -} -``` -杩欓噷鍊煎緱娉ㄦ剰鐨勬槸锛岀敱浜嶱ID鍛藉悕绌洪棿鐨勫眰娆℃э紝鐖跺懡鍚嶇┖闂磋兘鐪嬪埌瀛愬懡鍚嶇┖闂寸殑鍐呭锛屽弽涔嬪垯涓嶈兘锛屽洜姝わ紝鍑芥暟涓渶瑕佺‘淇濆綋鍓嶅懡鍚嶇┖闂寸殑level 灏忎簬绛変簬浜х敓灞閮≒ID鐨勫懡鍚嶇┖闂寸殑level銆 - -闄や簡杩欎釜鍑芥暟涔嬪锛屽唴鏍歌繕灏佽浜嗗叾浠栧嚱鏁扮敤鏉ヤ粠 pid 瀹炰緥鑾峰緱 PID 鍊硷紝濡 pid_nr銆乸id_vnr 绛夈傚湪姝や笉浠嬬粛浜嗐 -缁撳悎杩欎袱姝ワ紝鍐呮牳鎻愪緵浜嗘洿杩涗竴姝ョ殑灏佽锛屾彁渚涗互涓嬪嚱鏁帮細 -```c -pid_t task_pid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns); -pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns); -pid_t task_pigd_nr_ns(struct task_struct *tsk, struct pid_namespace *ns); -pid_t task_session_nr_ns(struct task_struct *tsk, struct pid_namespace *ns); -``` -浠庡嚱鏁板悕涓婂氨鑳芥帹鏂嚱鏁扮殑鍔熻兘锛屽叾瀹炰笉澶栦簬灏佽浜嗕笂闈㈢殑涓ゆ銆 - -##鏌ユ壘杩涚▼task_struct -------- - -鏍规嵁灞閮↖D銆佷互鍙婂懡鍚嶇┖闂达紝鎬庢牱鑾峰緱杩涚▼鐨則ask_struct缁撴瀯浣撳憿锛熶篃鏄垎涓ゆ锛 -鑾峰緱 pid 瀹炰綋銆傛牴鎹眬閮≒ID浠ュ強鍛藉悕绌洪棿璁$畻鍦 pid_hash 鏁扮粍涓殑绱㈠紩锛岀劧鍚庨亶鍘嗘暎鍒楄〃鎵惧埌鎵瑕佺殑 upid锛 鍐嶆牴鎹唴鏍哥殑 container_of 鏈哄埗鎵惧埌 pid 瀹炰緥銆備唬鐮佸涓嬶細 -``` -struct pid *find_pid_ns(int nr, struct pid_namespace *ns) -{ - struct hlist_node *elem; - struct upid *pnr; - //閬嶅巻鏁e垪琛 - hlist_for_each_entry_rcu(pnr, elem, - &pid_hash[pid_hashfn(nr, ns)], pid_chain) //pid_hashfn() 鑾峰緱hash鐨勭储寮 - if (pnr->nr == nr && pnr->ns == ns) //姣旇緝 nr 涓 ns 鏄惁閮界浉鍚 - return container_of(pnr, struct pid, //鏍规嵁container_of鏈哄埗鍙栧緱pid 瀹炰綋 - - numbers[ns->level]); - return NULL; -} -``` - -##鏍规嵁ID绫诲瀷鍙栧緱task_struct 缁撴瀯浣 -------- -``` -struct task_struct *pid_task(struct pid *pid, enum pid_type type) -{ - struct task_struct *result = NULL; - if (pid) { - struct hlist_node *first; - first = rcu_dereference_check(hlist_first_rcu(&pid->tasks[type]), - lockdep_tasklist_lock_is_held()); - if (first) - result = hlist_entry(first, struct task_struct, pids[(type)].node); - } - - return result; -} -``` - -鍐呮牳杩樻彁渚涘叾瀹冨嚱鏁扮敤鏉ュ疄鐜颁笂闈袱姝ワ細 -```c -struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns); -struct task_struct *find_task_by_vpid(pid_t vnr); -struct task_struct *find_task_by_pid(pid_t vnr); -``` - -鍏蜂綋鍑芥暟瀹炵幇鐨勫姛鑳戒篃姣旇緝绠鍗曘 - -##鐢熸垚鍞竴鐨凱ID -------- - -鍐呮牳涓娇鐢ㄤ笅闈袱涓嚱鏁版潵瀹炵幇鍒嗛厤鍜屽洖鏀禤ID鐨勶細 -```c -static int alloc_pidmap(struct pid_namespace *pid_ns); -static void free_pidmap(struct upid *upid); -``` - -鍦ㄨ繖閲屾垜浠笉鍏虫敞杩欎袱涓嚱鏁扮殑瀹炵幇锛屽弽鑰屽簲璇ュ叧娉ㄥ垎閰嶇殑 PID 濡備綍鍦ㄥ涓懡鍚嶇┖闂翠腑鍙锛岃繖鏍烽渶瑕佸湪姣忎釜鍛藉悕绌洪棿鐢熸垚涓涓眬閮↖D锛屽嚱鏁 alloc_pid 涓烘柊寤虹殑杩涚▼鍒嗛厤PID锛岀畝鍖栫増濡備笅锛 -```c -struct pid *alloc_pid(struct pid_namespace *ns) -{ - struct pid *pid; - enum pid_type type; - int i, nr; - struct pid_namespace *tmp; - struct upid *upid; - tmp = ns; - pid->level = ns->level; - // 鍒濆鍖 pid->numbers[] 缁撴瀯浣 - for (i = ns->level; i >= 0; i--) - { - nr = alloc_pidmap(tmp); //鍒嗛厤涓涓眬閮↖D - pid->numbers[i].nr = nr; - pid->numbers[i].ns = tmp; - tmp = tmp->parent; - } - // 鍒濆鍖 pid->task[] 缁撴瀯浣 - for (type = 0; type < PIDTYPE_MAX; ++type) - INIT_HLIST_HEAD(&pid->tasks[type]); - - // 灏嗘瘡涓懡鍚嶇┖闂寸粡杩囧搱甯屼箣鍚庡姞鍏ュ埌鏁e垪琛ㄤ腑 - upid = pid->numbers + ns->level; - for ( ; upid >= pid->numbers; --upid) - { - hlist_add_head_rcu(&upid->pid_chain, &pid_hash[pid_hashfn(upid->nr, upid->ns)]); - upid->ns->nr_hashed++; - } - - return pid; -} -``` diff --git a/study/process/pid/进程命名空间和进程的关系结构.png b/study/process/pid/进程命名空间和进程的关系结构.png deleted file mode 100644 index f89248b..0000000 Binary files a/study/process/pid/进程命名空间和进程的关系结构.png and /dev/null differ diff --git a/study/process/pid/命名空间的层次关系图.jpg b/study/process/pid/命名空间的层次关系图.jpg deleted file mode 100644 index 1060cf0..0000000 Binary files a/study/process/pid/命名空间的层次关系图.jpg and /dev/null differ diff --git a/study/process/pid/一个task_struct对应一个PID.png b/study/process/pid/一个task_struct对应一个PID.png deleted file mode 100644 index 77b9356..0000000 Binary files a/study/process/pid/一个task_struct对应一个PID.png and /dev/null differ diff --git a/study/process/pid/增加ID类型的结构.png b/study/process/pid/增加ID类型的结构.png deleted file mode 100644 index f128fa0..0000000 Binary files a/study/process/pid/增加ID类型的结构.png and /dev/null differ diff --git a/study/process/pid/增加PID命名空间之后的结构图.png b/study/process/pid/增加PID命名空间之后的结构图.png deleted file mode 100644 index 09f71da..0000000 Binary files a/study/process/pid/增加PID命名空间之后的结构图.png and /dev/null differ