Unix: 僵死進程
Unix: 僵死(Zombie)進程
進程在它的生命周期有幾種狀態(tài):睡眠,可運行,停止,正在運行和僵死狀態(tài)。所謂僵死進程,指的是一個進程已經(jīng)退出,它的內(nèi)存和相關(guān)的資源已經(jīng)被內(nèi)核釋放掉,但是在進程表中這個進程項(entry)還保留著,以便它的父進程得到它的退出狀態(tài)。一個進程退出時,它的父進程會收到一個SIGCHLD信號。一般情況下,這個信號的句柄通常執(zhí)行wait系統(tǒng)調(diào)用,這樣處于僵死狀態(tài)的進程會被刪除。如果父進程沒有這么做,結(jié)果是什么呢?毫無疑問,進程會處于僵死狀態(tài)。實際上,僵死進程不會對系統(tǒng)有太大的傷害,最多就是它的進程號(PID)和進程表中的進程項系統(tǒng)不能使用。
一個父進程fork了一個子進程出來,然后它們兩個就各自執(zhí)行自己的代碼,在某一時刻,子進程退出了。但是此時子進程還有一定的空間并沒有被操作系統(tǒng)回收。需要父進程使用wait系列的系統(tǒng)調(diào)用對該子進程進行回收,這樣子進程就能夠完全地從系統(tǒng)中消失。
所以僵尸進程就是說子進程在退出之后到被父進程回收之前的這段時間。
子進程死后,會發(fā)送SIGCHLD信號給父進程。
一個進程在調(diào)用exit命令結(jié)束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進程的狀態(tài)中,僵尸進程 是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態(tài)等信息供其他進程收集,除此之外,僵尸進程不再占有任何內(nèi)存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信號處理函數(shù)調(diào)用wait或waitpid()等待子進程結(jié)束,由于該信號的默認處理是忽略, 所以它就一直保持僵尸狀態(tài),如果這時父進程結(jié)束了,那么init進程自動會接手這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環(huán),不會結(jié)束,那么子進程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時會有很多的僵尸進程。
posted on 2013-05-14 14:45 hejianchao 閱讀(300) 評論(0) 編輯 收藏