通俗易懂的“僵死進程與孤兒進程”講解

原文來自:http://blog.chinaunix.net/uid-7897183-id-75583.html

在Unix系統編程中,常常會碰到兩個概念:僵死進程和孤兒進程。話說我以前曾經把這兩個概念弄混淆過。

什麼是僵死進程?我們知道,在Unix進程模型中,進程是按照父進程產生子進程,子進程產生子子進程這樣的方式創建出完成各項相互協作功能的進程的。當一個進程完成它的工作終止之後,它的父進程需要調用wait()或者waitpid()系統調用取得子進程的終止狀態。如果父進程沒有這麼做的話,會產生什麼後果呢?此時,子進程雖然已經退出了,但是在系統進程表中還爲它保留了一些退出狀態的信息,如果父進程一直不取得這些退出信息的話,這些進程表項就將一直被佔用,此時,這些佔着茅坑不拉屎的子進程就成爲“僵死進程”(zombie)。系統進程表是一項有限資源,如果系統進程表被僵死進程耗盡的話,系統就可能無法創建新的進程。

那麼,孤兒進程又是怎麼回事呢?孤兒進程是指這樣一類進程:在進程還未退出之前,它的父進程就已經退出了,一個沒有了父進程的子進程就是一個孤兒進程(orphan)。既然所有進程都必須在退出之後被wait()或waitpid()以釋放其遺留在系統中的一些資源,那麼應該由誰來處理孤兒進程的善後事宜呢?這個重任就落到了init進程身上,init進程就好像是一個民政局,專門負責處理孤兒進程的善後工作。每當出現一個孤兒進程的時候,內核就把孤兒進程的父進程設置爲init,而init進程會循環地wait()它的已經退出的子進程。這樣,當一個孤兒進程“淒涼地”結束了其生命週期的時候,init進程就會代表黨和政府出面處理它的一切善後工作。

這樣來看,孤兒進程並不會有什麼危害,真正會對系統構成威脅的是僵死進程。那麼,什麼情況下僵死進程會威脅系統的穩定呢?設想有這樣一個父進程:它定期的產生一個子進程,這個子進程需要做的事情很少,做完它該做的事情之後就退出了,因此這個子進程的生命週期很短,但是,父進程只管生成新的子進程,至於子進程退出之後的事情,則一概不聞不問,這樣,系統運行上一段時間之後,系統中就會存在很多的僵死進程,倘若用ps命令查看的話,就會看到很多狀態爲Z的進程。嚴格地來說,僵死進程並不是問題的根源,罪魁禍首是產生出大量僵死進程的那個父進程。因此,當我們尋求如何消滅系統中大量的僵死進程時,答案就是把產生大量僵死進程的那個元兇槍斃掉(也就是通過kill發送SIGTERM或者SIGKILL信號啦)。槍斃了元兇進程之後,它產生的僵死進程就變成了孤兒進程,這些孤兒進程會被init進程接管,init進程會wait()這些孤兒進程,釋放它們佔用的系統進程表中的資源,這樣,這些已經“僵死”的孤兒進程就能瞑目而去了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章