孤兒進程

操作系統領域中,孤兒進程(Orphan Process)指的是在其父進程執行完成或被終止英語exit (operating system)後仍繼續運行的一類進程

解決辦法

「收養」

類UNIX操作系統中,為避免孤兒進程退出時無法釋放所占用的資源而僵死,任何孤兒進程產生時都會立即為系統進程initsystemd自動接收為子進程,這一過程也被稱為「收養」(英語:re-parenting[1]。在此需注意,雖然事實上該進程已有init作為其父進程,但由於創建該進程的進程已不存在,所以仍應稱之為「孤兒進程」。

進程組

因為父進程終止或崩潰都會導致對應子進程成為孤兒進程,所以也無法預料一個子進程執行期間是否會被「遺棄」。有鑑於此,多數類UNIX系統都引入了進程組以防止產生孤兒進程:在父進程終止後,用戶的Shell會將父進程所在進程組標為「孤兒進程組」,並向終止的進程下屬所有子進程發出SIGHUP信號,以試圖結束其運行,如此避免子進程繼續以「孤兒進程」的身份運行[2]

遠程調用的情況

遠程過程調用過程中也會產生孤兒進程。例如,若客戶端進程在發起請求後突然崩潰,且對應的服務器端進程仍在運行,則該服務器端進程就會成為孤兒進程。這樣的孤兒進程會浪費服務器的資源,甚至有耗盡資源的潛在危險,但也有對應的解決辦法[3]

  1. 終止機制:強制殺死孤兒進程(最常用的手段);
  2. 再生機制:服務器在指定時間內查找調用的客戶端,若找不到則直接殺死孤兒進程;
  3. 超時機制:給每個進程指定一個確定的運行時間,若超時仍未完成則強制終止之。若有需要,亦可讓進程在指定時間耗盡之前申請延時。

「孤兒進程」的應用

除此之外,用戶也可能會刻意使進程成為孤兒進程,以使之與用戶會話脫鈎,並轉至後台運行。這一做法常應用於啟動需要長時間運行的進程,也即守護進程[4]。另外,UNIX命令nohup也可以完成這一操作[5]

參見

參考

  1. ^ Robert Love. Linux Kernel Development. Novell Press. 2005. 
  2. ^ GNU C Library Manual. GNU Project. [2012-12-30]. (原始內容存檔於2012-12-25).  |chapter=被忽略 (幫助)
  3. ^ Er. Vivek Sharma, Er. Manish Varshney, Shantanu Sharma. Design and Implementation of Operating System. Laxmi Publication Pvt. Ltd. 
  4. ^ 杜華. 8.2.1 实现守护进程的步骤. Linux编程技术详解. 人民郵電出版社. 2007. 
  5. ^ nohup(1) - Linux man page. [2012-12-30]. (原始內容存檔於2013-01-03).