孤兒行程
解決辦法
「收養」
在類UNIX作業系統中,為避免孤兒行程退出時無法釋放所佔用的資源而僵死,任何孤兒行程產生時都會立即為系統行程init或systemd自動接收為子行程,這一過程也被稱為「收養」(英語:re-parenting)[1]。在此需注意,雖然事實上該行程已有init作為其父行程,但由於建立該行程的行程已不存在,所以仍應稱之為「孤兒行程」。
行程群組
因為父行程終止或崩潰都會導致對應子行程成為孤兒行程,所以也無法預料一個子行程執行期間是否會被「遺棄」。有鑑於此,多數類UNIX系統都引入了行程群組以防止產生孤兒行程:在父行程終止後,用戶的Shell會將父行程所在行程群組標為「孤兒行程群組」,並向終止的行程下屬所有子行程發出SIGHUP訊號,以試圖結束其執行,如此避免子行程繼續以「孤兒行程」的身份執行[2]。
遠端呼叫的情況
遠程過程調用過程中也會產生孤兒行程。例如,若客戶端行程在發起請求後突然崩潰,且對應的伺服器端行程仍在執行,則該伺服器端行程就會成為孤兒行程。這樣的孤兒行程會浪費伺服器的資源,甚至有耗盡資源的潛在危險,但也有對應的解決辦法[3]:
- 終止機制:強制殺死孤兒行程(最常用的手段);
- 再生機制:伺服器在指定時間內尋找呼叫的客戶端,若找不到則直接殺死孤兒行程;
- 逾時機制:給每個行程指定一個確定的執行時間,若逾時仍未完成則強制終止之。若有需要,亦可讓行程在指定時間耗盡之前申請延時。
「孤兒行程」的應用
除此之外,用戶也可能會刻意使行程成為孤兒行程,以使之與用戶對談脫鈎,並轉至背景執行。這一做法常應用於啟動需要長時間執行的行程,也即守護行程[4]。另外,UNIX命令nohup也可以完成這一操作[5]。
參見
參考
- ^ Robert Love. Linux Kernel Development. Novell Press. 2005.
- ^ GNU C Library Manual. GNU Project. [2012-12-30]. (原始內容存檔於2012-12-25).
|chapter=
被忽略 (幫助) - ^ Er. Vivek Sharma, Er. Manish Varshney, Shantanu Sharma. Design and Implementation of Operating System. Laxmi Publication Pvt. Ltd.
- ^ 杜華. 8.2.1 实现守护进程的步骤. Linux编程技术详解. 人民郵電出版社. 2007.
- ^ nohup(1) - Linux man page. [2012-12-30]. (原始內容存檔於2013-01-03).