殭屍程序與孤兒程序

2021-10-03 08:34:00 字數 1352 閱讀 5075

程序是計算機中的程式關於某個資料集合上的一次執行活動,是系統進行資源分配的基本單位。與之對應的概念是執行緒,執行緒是系統排程的基本單位。

即子程序先與父程序退出後,子程序的pcb需要父程序釋放,凡是父程序並沒有釋放子程序的pcb,這樣的子程序就成為殭屍程序。殭屍程序實際上是乙個已經死掉的程序。

乙個程序在呼叫exit命令結束自己宣告的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zoombie)的資料結構(系統呼叫exit,它會使程序退出,但也僅僅限於把正常的程序變成了殭屍程序,並不能將其完全銷毀)。在linux程序的狀態中,殭屍程序是非常特殊的一種,它幾乎放棄了所有的記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留了乙個位置,記錄了該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間,這個程序需要它的父程序為它收屍,如果它的父程序沒有處理這個殭屍程序的措施,那麼它就一直保持殭屍狀態,如果這時候父程序結束了,那麼init程序會自動接手這個子程序,為它收屍,它還是能被清楚的,但是如果父程序是乙個迴圈,不會結束,那麼子程序就一直保持在殭屍狀態,這就是為什麼系統中有時候會有很多的殭屍程序。

如果有大量的殭屍程序駐在記憶體之中,必定造成大量的系統資源浪費。但是系統資源是有限的,因此當殭屍程序達到一定的數目時,系統因缺乏資源而導致崩潰,所以實際程式設計中,避免和防範殭屍程序的產生尤為重要。

那麼該如何避免產生殭屍程序呢?

1. 暴力做法,直接將其父程序殺死。那麼它的子程序,即殭屍程序將會變成孤兒程序,由系統來**。但是這種做法在大多數情況下是不可取的,如父程序是乙個伺服器程式,如果為了**子程序的資源,而殺死伺服器程式,那麼將導致整個伺服器程式崩潰,得不償失,顯然這種**程序的方式是不可取的,但是也有一定的存在意義。

2. sigchld訊號處理

我們都知道wait()函式是處理殭屍程序的,但是程序一旦呼叫了wait(),就立即阻塞自己。由wait自動分析是否當前程序的某個子程序是否退出。如果讓它找到了乙個這樣的已經變成殭屍程序的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回。如果沒有這樣乙個子程序wait就會一直阻塞在這裡,直到有乙個出現為止。

乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將會成為孤兒程序。孤兒程序將被init(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

子程序死亡需要父程序來處理,那麼意味著正常的程序應該是子程序先於父程序死亡,當父程序先於子程序死亡時,子程序死亡時沒有父程序處理,這個死亡的程序就是孤兒程序。

但孤兒程序與殭屍程序不同的是,由於父程序已經死亡,系統會幫助父程序**處理孤兒程序。所以孤兒程序實際上是不占用系統資源的,因為它終究被系統**了,不會像殭屍程序那樣占用id,損害執行系統。

總的來說,就是孤兒程序不占用系統資源,殭屍程序會占用系統資源,所以應該盡力避免殭屍程序的出現。

殭屍程序與孤兒程序

殭屍程序 如果乙個程序通過fork 建立子了乙個程序,當子程序退出而父程序還沒有呼叫wait waitpid來儲存子程序的狀態且 它,此時子程序的狀態描述資訊仍然保留在系統中,稱這類程序為殭屍程序 殭屍程序的優點是方便上層程序得知子程序的退出狀態,但是如果不及時 會造成記憶體洩露 孤兒程序 當乙個父...

殭屍程序與孤兒程序

孤兒程序是指在程序還未退出之前它的父程序就已經先退出了,簡單來說就是乙個沒有父程序的子程序就是孤兒程序。既然所有的程序都必須在退出之後被父程序的wait 或waitpid 以釋放其遺留在系統中的一些資源,那麼孤兒程序的這些東西又誰來處理呢?這個任務就落到了init程序的身上,init程序就好像乙個收...

殭屍程序與孤兒程序

在父程序執行wait 之前,其子程序就已終止,即使子程序終止,系統也允許父程序在以後的某個時刻去執行wait 以確定子程序是如何終止。核心通過將子程序轉為殭屍程序,以釋放其占用的系統資源,供其他程序使用,該程序唯一保留的是系統pcb中的一條記錄,其中包含了子程序的id,終止狀態,和資源使用的資料。當...