什么是僵尸进程与孤儿进程
1、什么是僵尸進程和孤兒進程:
????????在 Unix/Linux 系統(tǒng)中,正常情況下,子進程是通過父進程創(chuàng)建的,且兩者的運行是相互獨立的,父進程永遠無法預測子進程到底什么時候結束。當一個進程調用 exit 命令結束自己的生命時,其實它并沒有真正的被銷毀,內核只是釋放了該進程的所有資源,包括打開的文件、占用的內存等,但是留下一個稱為僵尸進程的數據結構,這個結構保留了一定的信息(包括進程號 the process ID,退出狀態(tài),運行時間),這些信息直到父進程通過 wait()/waitpid() 來取時才釋放。這樣設計的目的主要是保證只要父進程想知道子進程結束時的狀態(tài)信息,就可以得到
-
僵尸進程:一個進程使用 fork 創(chuàng)建子進程,如果子進程退出,而父進程并沒有調用 wait 或 waitpid 獲取子進程的狀態(tài)信息,那么子進程的進程描述符仍然保存在系統(tǒng)中,這種進程稱之為僵死進程。
-
孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那么這些子進程將成為孤兒進程。孤兒進程將被 init 進程(進程號為1)所收養(yǎng),并由 init 進程對它們完成狀態(tài)收集工作。
2、僵尸進程與孤兒進程的問題危害:
????????僵尸進程雖然不占有任何內存空間,但如果父進程不調用 wait() / waitpid() 的話,那么保留的信息就不會釋放,其進程號就會一直被占用,而系統(tǒng)所能使用的進程號是有限的,如果大量的產生僵死進程,將因為沒有可用的進程號而導致系統(tǒng)不能產生新的進程,此即為僵尸進程的危害。
????????孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了 init 進程身上,init 進程就好像是一個民政局,專門負責處理孤兒進程的善后工作。每當出現一個孤兒進程的時候,內核就把孤兒進程的父進程設置為 init,而 init 進程會循環(huán)地 wait() 它的已經退出的子進程。這樣,當一個孤兒進程凄涼地結束了其生命周期的時候,init 進程就會出面處理它的一切善后工作。因此孤兒進程并不會有什么危害。
如果子進程在 exit() 之后,父進程沒有來得及處理,這時用 ps 命令就能看到子進程的狀態(tài)是“Z”。如果父進程能及時處理,可能用 ps 命令就來不及看到子進程的僵尸狀態(tài),但這并不等于子進程不經過僵尸狀態(tài)。 如果父進程在子進程結束之前退出,則子進程將由 init 接管。init 將會以父進程的身份對僵尸狀態(tài)的子進程進行處理。
3、如果解決僵尸進程造成的問題:
(1)方案一:父進程通過 wait 和 waitpid 等函數等待子進程結束,但這會導致父進程掛起,所以這并不是一個好辦法,父進程如果不能和子進程并發(fā)執(zhí)行的話,那我們創(chuàng)建子進程的意義就沒有。同時一個 wait 只能解決一個子進程,如果有多個子進程就要用到多個 wait
(2)方案二:通過信號機制:
????????子進程退出時,向父進程發(fā)送 SIGCHILD 信號,父進程處理 SIGCHILD 信號,在信號處理函數中調用 wait 進行處理僵尸進程。
(3)方案三:fork兩次:
????????原理是將進程成為孤兒進程,從而其的父進程變?yōu)?init 進程,通過 init 進程處理僵尸進程。具體操作為:父進程一次 fork() 后產生一個子進程隨后立即執(zhí)行 wait(NULL) 來等待子進程結束,然后子進程 fork() 后產生孫子進程隨后立即exit(0)。這樣子進程順利終止(父進程僅僅給子進程收尸,并不需要子進程的返回值),然后父進程繼續(xù)執(zhí)行。這時的孫子進程由于失去了它的父進程(即是父進程的子進程),將被轉交給Init進程托管。于是父進程與孫子進程無繼承關系了,它們的父進程均為Init,Init進程在其子進程結束時會自動收尸,這樣也就不會產生僵死進程了
(4)方案四:kill 父進程:
????????嚴格地來說,僵死進程并不是問題的根源,罪魁禍首是產生出大量僵死進程的那個父進程。因此,當我們尋求如何消滅系統(tǒng)中大量的僵死進程時,答案就是把產生大量僵死進程的那個元兇槍斃掉(也就是通過 kill 發(fā)送 SIGTERM 或者 SIGKILL 信號啦)。槍斃了元兇進程之后,它產生的僵死進程就變成了孤兒進 程,這些孤兒進程會被 init 進程接管,init 進程會 wait() 這些孤兒進程,釋放它們占用的系統(tǒng)進程表中的資源,這樣,這些已經僵死的孤兒進程就能瞑目而去了。
參考文章:
https://www.cnblogs.com/Anker/p/3271773.html
https://www.cnblogs.com/jian-99/p/7739369.html
總結
以上是生活随笔為你收集整理的什么是僵尸进程与孤儿进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC多线程:Atomic原子类与CAS
- 下一篇: Tomcat 的类加载机制