孤兒行程

作業系統領域中,孤兒行程(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).