僵死進程

1.僵死進程的產生:

在每個進程調用exit()退出的時候,內核釋放該進程所有的資源包括打開的文件,佔用的內存等,但是仍然爲其保留一定的信息(包括進程號,退出狀態 

,運行時間等), 直到父進程通過wait/waitpid來取時才釋放。在unix術語中,一個已經終止但是父進程還尚未對其做善後處理的進程成爲僵死進程。僵死進程保證了父進程可以獲取到該進程結束時的狀態信息。

在Linux進程的狀態中,僵死進程是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵死進程不再佔有任何內存空間。它需要它的父進程來爲它收屍,如果他的父進程沒安裝SIGCHLD信號處理函數並在函數中調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號讓內核去處理這些子進程,那麼它就一直保持僵死狀態,如果這時父進程結束了,僵死的子進程成爲"孤兒進程",過繼給1號進程init,init始終會負責清理僵死進程,父進程產生的所有僵死進程也跟着消失(每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init來接管他,成爲他的父進程)。但是如果如果父進程是一個循環,不會結束,那麼子進程就會一直保持僵死狀態,這就是爲什麼系統中有時會有很多的僵死進程。怎麼查看僵死進程,利用命令ps,可以看到有標記爲Z的進程就是僵死進程。


2.僵死進程的危害:

(1)如果父進程不調用wait/waitpid的話, 那麼保留的那段信息就不會釋放,其進程號會一定被佔用,但是系統所能使用的進程號是有限的,如果產生了大量的僵死進程,將因爲沒有可用的進程號而導致系統不能產生新的進程。 

 ( 2 )僵死進程會一直佔用系統資源,嚴重影響服務器的性能。


3.僵死進程的避免

1、父進程通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起 
2、如果父進程很忙,那麼可以用signal函數爲SIGCHLD安裝信號處理函數。子進程結束後,父進程會收到該信號,可以在信號處理函數中調用wait回收 。
3、如果父進程不關心子進程什麼時候結束,那麼可以用signal(SIGCHLD, SIG_IGN)通知內核,自己對子進程的結束不感興趣,那麼子進程結束後,內核會回收, 並不再給父進程
發送信號。

4.兩次fork







在每個進程退出的時候,內核釋放該進程所有的資源,包括打開的文件,佔用的內存等,但是仍然爲其保留一定的信息(包括進程號the process ID,退出狀態the 
termination status of the process,運行時間the amount of CPU time taken by the process等), 直到父進程通過wait/waitpid來取時才釋放。此時該進程處於僵死狀態,該進程成爲僵死進程(Zombie Process)。 這保證了父進程可以獲取到子進程結束時的狀態信息。

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