殭屍程序和孤兒程序的模擬實現

2021-07-31 07:58:13 字數 2249 閱讀 5042

首先,介紹一下殭屍程序與孤兒程序定義:

殭屍程序: 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。子程序雖然已經退出了,但是在系統程序表中還為它保留了一些退出狀態的資訊,如果父程序一直不取得這些退出資訊的話,這些程序表項就將一直被占用此時,這些佔著資源又不幹活的子程序就成為「僵死程序」(zombie)。系統程序表是一項有限資源,如果系統程序表被僵死程序耗盡的話,系統就可能無法建立新的程序。

孤兒程序:在程序還未退出之前,它的父程序就已經退出了,乙個沒有了父程序的子程序就是乙個孤兒程序 (orphan)。既然所有程序都必須在退出之後被wait()或waitpid()以釋放其遺留在系統中的一些資源,而孤兒程序就會被init處理,init程序專門負責處理孤兒程序的善後工作。每當出現乙個孤兒程序的時候,核心就把孤兒程序的父程序設定為init,而init程序會迴圈地wait()它的已經退出的子程序。這樣,當乙個孤兒程序結束了其生命週期的時候,init程序就會處理它的一切善後工作。

下面實現乙個簡單的殭屍程序: 

測試結果如下:

還有另一種情況:就是父程序不斷的建立子程序:

測試結果出現無休止的建立**,這種無休止的建立**最後就會耗盡程序表,系統也就無法建立別的程序了。

殭屍程序的解決方法:

(1)子程序退出時向父程序傳送sigchild訊號,父程序處理sigchild訊號。在訊號處理函式中呼叫wait進行處理殭屍程序。

(2) 原理是將子程序成為孤兒程序,從而其的父程序變為init程序,通過init程序可以處理殭屍程序。

孤兒程序的測試

看看 測試結果

任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。  如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對子程序進行處理。

這樣來看,

孤兒程序並不會有什麼危害,真正會對系統構成威脅的是僵死程序

。例如有這樣乙個父程序:它定期的產生乙個子程序,這個子程序做完它該做的事情之後就退出了,因此這個子程序的生命週期很短,但是,父程序只管生成新的子程序,至於子程序退出之後的事情,則一概不聞不問,這樣,系統執行上一段時間之後,系統中就會存在很多的僵死程序,倘若用ps命令檢視的話,就會看到很多狀態為z的程序。 嚴格地來說,僵死程序並不是問題的根源,罪魁禍首是產生出大量僵死程序的那個父程序。因此,當我們需要消滅系統中大量的僵死程序時, 就要把產生大量僵死程序的那個殺掉(也就是通過kill傳送sigterm或者sigkill訊號)。槍斃了元凶程序之後,它產生的僵死程序就變成了孤兒程序,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們占用的系統程序表中的資源 。

殭屍程序與孤兒程序的區別:

孤兒程序是子程序還在執行,而父程序掛了,子程序被init程序收養。殭屍程序是父程序還在執行但是子程序掛了,但是父程序卻沒有使用wait來清理子程序的程序資訊,導致子程序雖然執行實體已經消失,但是仍然在核心的程序表中佔據一條記錄,這樣長期下去對於系統資源是乙個浪費。殭屍程序將會導致資源浪費,而孤兒則不會。

模擬實現殭屍程序和孤兒程序

殭屍程序 乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。程序在終止時,系統會 所有核心分配給它的記憶體 關閉它開啟的所有檔案等等,但還會保留一些極少的資訊,因為 程序終止後有些資訊對於父程序和核心還是很有用的,例如程序的id號 程序的退出狀態 程序執行...

模擬實現殭屍程序和孤兒程序

首先我們來先了解一下什麼是殭屍程序和孤兒程序?當你建立了子程序後,讓父子程序幹不同的事,如果,子程序先完成事情要退出時,然後它就會等 人 來讀取它的退出狀態資訊 也就是他的父程序 這個時候,子程序就需要一直維持這這個狀態,這個狀態就是殭屍狀態 我們也稱為z狀態 也就是說,當乙個子程序退出時,他的父程...

模擬實現殭屍程序, 孤兒程序

在linux下程序有多種狀態以下就是我列舉的一些狀態 r執行狀態 running 並不意味著程序一定在執行中,它表明程序要麼在執行中要麼在執行佇列裡。s睡眠狀態 sleeping 意味著程序在等待事件的完成 這裡的睡眠有時候也會叫可中斷睡眠 interruptible sleep d磁碟休眠狀態 d...