簡析孤兒程序與殭屍程序

2021-09-23 14:23:39 字數 951 閱讀 1648

在unix/linux中,正常情況下,子程序是通過父程序建立的

子程序的結束和父程序的執行是乙個非同步過程, 即父程序永遠無法**子程序到底什麼時候結束。

當程序完成它的工作之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態

乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序

孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作

init程序會迴圈地wait()它的已經退出的子程序, 當子程序結束生命週期後,init程序**資源, 因此孤兒程序並不會有什麼危害

在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等,但是仍然為其保留一定的資訊(包括程序號, 退出狀態, 執行時間等), 直到父程序通過wait / waitpid來取時才釋放

如果子程序退出,而父程序並沒有呼叫waitwaitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為殭屍程序

危害: 系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序

處理殭屍程序:kill掉產生殭屍程序的父程序, 殭屍程序會自動由init程序收養, 由init程序**殭屍程序的狀態資訊,從而殭屍程序會正常結束

殭屍程序與孤兒程序

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

殭屍程序與孤兒程序

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

殭屍程序與孤兒程序

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