linux ps 进程组,linux进程管理(2)---进程的组织结构
一、目的
linux為了不同的進(jìn)程管理目的,使用了不同的方法組織進(jìn)程之間的關(guān)系,為了體現(xiàn)父子關(guān)系,使用了“樹形”圖;為了對同一信號量統(tǒng)一處理,使用了進(jìn)程組;為了快速查找某個進(jìn)程,使用了哈希表;為了進(jìn)程調(diào)度,創(chuàng)建了運(yùn)行隊列、等待隊列,將不同運(yùn)行狀態(tài)的進(jìn)程放入不同的隊列中。
本文將講述進(jìn)程間的組織方式及特點。
二、父子關(guān)系、兄弟關(guān)系
系統(tǒng)啟動后創(chuàng)建第一個進(jìn)程0(swapper,也叫idle)和進(jìn)程1(init),之后進(jìn)程0進(jìn)入idle狀態(tài),當(dāng)沒有進(jìn)程可以被調(diào)度的時候運(yùn)行該進(jìn)程,不做具體的事情;系統(tǒng)其它的進(jìn)程都是由進(jìn)程1創(chuàng)建的,所以進(jìn)程1自然而然就是系統(tǒng)所有進(jìn)程的父進(jìn)程,系統(tǒng)進(jìn)程之間的關(guān)系也就呈現(xiàn)出“樹形”結(jié)構(gòu)。
進(jìn)程1還負(fù)責(zé)處理僵尸進(jìn)程。由于進(jìn)程0不具備處理僵尸進(jìn)程的能力,所以不能為進(jìn)程1創(chuàng)建兄弟進(jìn)程,否則當(dāng)進(jìn)程1的兄弟進(jìn)程處于僵尸態(tài)時,系統(tǒng)就無法處理這些僵尸進(jìn)程了。
當(dāng)一個進(jìn)程創(chuàng)建新進(jìn)程時,默認(rèn)新進(jìn)程是當(dāng)前進(jìn)程的子進(jìn)程;當(dāng)前進(jìn)程是新進(jìn)程的父進(jìn)程。當(dāng)使用CLONE_PARENT參數(shù)標(biāo)志創(chuàng)建新進(jìn)程時,當(dāng)前進(jìn)程和新進(jìn)程擁有相同的父進(jìn)程。
當(dāng)兩個進(jìn)程之間是父子關(guān)系時,父進(jìn)程的children成員連接了所有子進(jìn)程;子進(jìn)程的sibling成員連接了該子進(jìn)程的所有兄弟進(jìn)程(即父進(jìn)程的所有子進(jìn)程),real_parent成員指向?qū)嶋H的父進(jìn)程,parent成員指向了實際處理子進(jìn)程SIGCHLD信號的進(jìn)程。
使用ps命令的-H參數(shù)可以顯示進(jìn)程的父子關(guān)系。例如,在當(dāng)前bash下新建子進(jìn)程bash,并在子進(jìn)程bash中創(chuàng)建子進(jìn)程ps,使用ps-H命令顯示效果如下:
三、進(jìn)程組
在《linux進(jìn)程管理(1)---進(jìn)程描述符》的第三節(jié)詳述了linux下進(jìn)程與進(jìn)程組的概念,為了滿足POSIX標(biāo)準(zhǔn),linux提出了進(jìn)程組的概念;多個進(jìn)程合作完成一個功能,那么這些進(jìn)程可以放到一個進(jìn)程組中。
每個進(jìn)程組都會指定一個進(jìn)程為“組長”;“組員”通過使用group_leader成員指向“組長”;同時,“組長”使用thread_group成員將“組員”組織起來。
使用進(jìn)程組可以解決系統(tǒng)給一組進(jìn)程發(fā)送同一信號量的場景,在該場景下,系統(tǒng)只需給“組長”發(fā)送信號量即可,所以處于同一進(jìn)程組的進(jìn)程之間共享信號量資源。
默認(rèn)情況下,新進(jìn)程獨自組成了一個進(jìn)程組并且承擔(dān)“組長”的責(zé)任;如果使用CLONE_THREAD參數(shù)標(biāo)志,指定新進(jìn)程與當(dāng)前進(jìn)程處于同一進(jìn)程組,那么,此時當(dāng)前進(jìn)程與新進(jìn)程之間不存在父子關(guān)系(實際上,新進(jìn)程指向當(dāng)前進(jìn)程的父進(jìn)程),但是這兩個進(jìn)程擁有相同的“組長”,所以,在這種情況下,從進(jìn)程組的角度才能準(zhǔn)確表達(dá)進(jìn)程之間的關(guān)系。
使用ps命令的-eLf參數(shù)可以查看進(jìn)程組關(guān)系,顯示結(jié)果中PID表示進(jìn)程組ID(注意,此時PID的含義是tgid)、PPID表示父進(jìn)程ID、LWP表示進(jìn)程ID、NLWP表示進(jìn)程組中進(jìn)程的個數(shù)。
例如,使用ps
-eLf命令后,可以看到rsyslogd進(jìn)程組有四個“組員”(即四個線程),“組長”的pid是821,“組員”的pid分別是821、844、895、896;821“組員”也是該組的“組長”。
默認(rèn)情況下proc文件系統(tǒng)顯示的是進(jìn)程組“組長”的文件夾,使用ps-eLf命令找到進(jìn)程組“成員”的pid(對應(yīng)輕量級進(jìn)程的pid即LWP),然后直接在proc目錄下cd到pid文件夾中即可。
四、哈希表
為了快速查找某個進(jìn)程,系統(tǒng)將所有進(jìn)程連接在一個全局的鏈表中,表頭是init進(jìn)程的tasks成員;當(dāng)一個進(jìn)程被創(chuàng)建時,會將該進(jìn)程的tasks成員鏈接到init進(jìn)程的tasks中。
所以,從當(dāng)前進(jìn)程出發(fā),向上尋找父進(jìn)程,一直找到init進(jìn)程為止;那么就可以從init進(jìn)程的tasks成員鏈表找到任意一個進(jìn)程。
使用ps命令的-AL參數(shù)可以顯示所有進(jìn)程,包括輕量級進(jìn)程。
五、運(yùn)行隊列、等待隊列
調(diào)度程序使用運(yùn)行隊列和等待隊列管理進(jìn)程的調(diào)度,處于運(yùn)行隊列中的進(jìn)程滿足調(diào)度條件,隨時等待調(diào)度程序?qū)⑵浞湃隿pu運(yùn)行;處于等待隊列中的進(jìn)程由于缺乏某個資源而睡眠,當(dāng)條件滿足時被放入運(yùn)行隊列中。
運(yùn)行隊列管理的是處于運(yùn)行態(tài)的進(jìn)程,等待隊列管理的是睡眠態(tài)的進(jìn)程(可中斷態(tài)和不可中斷態(tài)),其他狀態(tài)的進(jìn)程(退出態(tài)、停止態(tài)等)因為和系統(tǒng)調(diào)度無關(guān),所以不會放入隊列中管理。因此,只有運(yùn)行態(tài)和睡眠態(tài)的進(jìn)程才會被放入隊列中。
處于運(yùn)行態(tài)的進(jìn)程具有不同優(yōu)先級,根據(jù)優(yōu)先級又可以把進(jìn)程放到不同優(yōu)先級的運(yùn)行隊列中。
等待隊列是linux比較常用的數(shù)據(jù)結(jié)構(gòu),在很多地方都使用該結(jié)構(gòu),例如:中斷處理、進(jìn)程同步等場景。處于睡眠態(tài)的進(jìn)程可能因為不同的事件而阻塞,所以根據(jù)事件類型又可以把進(jìn)程放到不同事件的等待隊列中。
六、全景視圖
為了有個直觀的感受,給出一幅進(jìn)程組織關(guān)系的全景視圖。
從圖中可以看出,內(nèi)核進(jìn)程idle有兩個孩子kthreadd、init;init進(jìn)程有三個孩子ksyslogd,并且這三個孩子組成了一個進(jìn)程組,“組長”是進(jìn)程826,“組員”是進(jìn)程845、進(jìn)程887;此時,有一個等待隊列,隊列中有兩個成員,分別指向了進(jìn)程845、進(jìn)程887。
七、總結(jié)
為了管理進(jìn)程的創(chuàng)建、消亡(處理僵尸進(jìn)程等操作)使用了父子、兄弟關(guān)系;為了統(tǒng)一處理同一信號量,使用進(jìn)程組關(guān)系;為了方便全局查找,使用了哈希表關(guān)系;為了調(diào)度程序,使用了運(yùn)行隊列、等待隊列數(shù)據(jù)結(jié)構(gòu)。
我們不僅要掌握這些進(jìn)程組織關(guān)系的具體含義,更重要的是思考linux精心設(shè)計這些組織關(guān)系背后的“驅(qū)動力”和技巧。當(dāng)我們以后遇到類似場景時,能夠“拿來主義”為我所用。
版權(quán)聲明:
原創(chuàng)作品,如非商業(yè)性轉(zhuǎn)載,請注明出處;如商業(yè)性轉(zhuǎn)載出版,請與作者聯(lián)系。
原文:http://blog.csdn.net/luomoweilan/article/details/21411943
總結(jié)
以上是生活随笔為你收集整理的linux ps 进程组,linux进程管理(2)---进程的组织结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中值滤波器和双边滤波器(python实现
- 下一篇: mongoose 笔记