這裡僅給出殭屍程序和孤兒程序的概念。**《深入了解計算機系統(原書第3版)》和網上的部落格,下面會給出部落格**。
前言:**子程序
當乙個程序由於某種原因終止時,核心並不是立即把它從系統中清除。相反,程序被保持在一種已終止的狀態中,直到被它的父程序**(reaped)。當父程序**已終止的子程序時,核心將子程序的退出狀態傳遞給父程序,然後拋棄已終止的程序。從此時開始,該程序就不存在了。
1、基本概念
殭屍程序:乙個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。
孤兒程序:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。
2、相關問題
(1)子程序結束後為什麼要進入殭屍狀態?
因為父程序可能要取得子程序的退出狀態等資訊。
(2)殭屍狀態是每個子程序必經的狀態嗎?
是的。 任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時 處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。 * 如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對殭屍狀態的子程序進行處理。
3、危害
(1)unix提供了一種機制可以保證只要父程序想知道子程序結束時的狀態資訊, 就可以得到。這種機制就是: 在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。 但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放。 但這樣就導致了問題,如果程序不呼叫wait / waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。
(2)孤兒程序是沒有父程序的程序。如果乙個父程序終止了,核心會安排init程序稱為它的孤兒程序的養父,init程序的pid為1,是系統在啟動是由核心建立的,它不會終止,是所有程序的祖先,核心會安排init程序去**他們。因此孤兒程序並不會有什麼危害。
4、避免殭屍程序的幾種方法
(1)將子程序成為孤兒程序,從而其的父程序變為init程序,通過init程序可以處理殭屍程序;
(2)讓殭屍程序的父程序來**,父程序每隔一段時間來查詢子程序是否結束並**,呼叫wait()或者waitpid(),通知核心釋放殭屍程序
(3)子程序退出時向父程序傳送sigchild訊號,父程序處理sigchild訊號。在訊號處理函式中呼叫wait進行處理殭屍程序。
ref:
孤兒程序和殭屍程序的概念
孤兒程序 父程序先於子程序結束,則子程序成為孤兒程序,子程序的父程序成為init程序,稱為init程序領養孤兒程序。orphan.c include include include int main void else if pid 0 else return 0 殭屍程序 程序終止,父程序尚未 子...
殭屍程序和孤兒程序
殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...
殭屍程序和孤兒程序
什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...