我們都知道linux中的程序可以分有多種狀態:
r(runing):執行狀態
s(sleeping):淺度睡眠狀態
d(disk sleep):磁碟睡眠狀態
t(stopped):停止程序
x(dead):死亡狀態
z(zombie):殭屍狀態
殭屍狀態
(1)殭屍狀態是乙個比較特殊的狀態,當程序退出父程序(使用wait()系統呼叫)沒有讀取到子程序退出的返回**時就會產生殭屍程序。殭屍程序會在以終止狀態保持在程序表中,並且會一直等待父程序讀取退出狀態**
執行結果:
我們知道殭屍程序的產生是因為程序退出時父程序並沒有等待子程序,也就是說,父程序和子程序是不同步的。
那麼問題來了,父程序是不會**到子程序退出的,也就不會第一時間去處理,所以,linux為了防止子程序丟失退出時的狀態資訊,而產生了殭屍程序。也就是說,子程序雖然退出釋放資源,然而仍有一部分資源等著父程序來釋放,父程序來釋放之前一直都是占用著記憶體的,那麼,如果有很多的殭屍程序呢?那還不卡死。
子程序程序號會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序。
那麼如何避免這個問題呢?
⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。
⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。
⒊ 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。
⒋ 還有一些技巧,就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。
孤兒程序
乙個父程序退出,而他的乙個或者多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對他們完成狀態收集工作。
執行結果:
任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。 如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對子程序進行處理。
這樣來看,孤兒程序並不會有什麼危害,真正會對系統構成威脅的是僵死程序。例如有這樣乙個父程序:它定期的產生乙個子程序,這個子程序做完它該做的事情之後就退出了,因此這個子程序的生命週期很短,但是,父程序只管生成新的子程序,至於子程序退出之後的事情,則一概不聞不問,這樣,系統執行上一段時間後,系統中就會存在很多的僵死程序,倘若用ps命令檢視的話,就會看到很多狀態為z的程序。 嚴格地來說,僵死程序並不是問題的根源,罪魁禍首是產生出大量僵死程序的那個父程序。因此,當我們需要消滅系統中大量的僵死程序時, 就要把產生大量僵死程序的那個殺掉(也就是通過kill傳送sigterm或者sigkill訊號)。槍斃了元凶程序之後,它產生的僵死程序就變成了孤兒程序,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們占用的系統程序表中的資源 。
殭屍程序與孤兒程序的區別:
孤兒程序是子程序還在執行,而父程序掛了,子程序被init程序收養。殭屍程序是父程序還在執行但是子程序掛了,但是父程序卻沒有使用wait來清理子程序的程序資訊,導致子程序雖然執行實體已經消失,但是仍然在核心的程序表中佔據一條記錄,這樣長期下去對於系統資源是乙個浪費。殭屍程序將會導致資源浪費,而孤兒則不會。
解析殭屍程序和孤兒程序
大家都知道linux中的程序分為多種狀態,例如 r running 執行狀態 s sleeping 睡眠狀態 淺度睡眠 d disk sleep 磁碟睡眠狀態 t stopped 停止程序 x dead 死亡狀態 z zombie 僵死狀態等等。僵死狀態是乙個比較特殊的狀態 當程序退出並且父程序 使...
殭屍程序與孤兒程序
殭屍程序 如果乙個程序通過fork 建立子了乙個程序,當子程序退出而父程序還沒有呼叫wait waitpid來儲存子程序的狀態且 它,此時子程序的狀態描述資訊仍然保留在系統中,稱這類程序為殭屍程序 殭屍程序的優點是方便上層程序得知子程序的退出狀態,但是如果不及時 會造成記憶體洩露 孤兒程序 當乙個父...
殭屍程序與孤兒程序
孤兒程序是指在程序還未退出之前它的父程序就已經先退出了,簡單來說就是乙個沒有父程序的子程序就是孤兒程序。既然所有的程序都必須在退出之後被父程序的wait 或waitpid 以釋放其遺留在系統中的一些資源,那麼孤兒程序的這些東西又誰來處理呢?這個任務就落到了init程序的身上,init程序就好像乙個收...