行程與行程抽象
孤兒行程(orphan process)
想像一個孩子,父母比孩子先離開——孩子還活著、照常過著日子,但那個對他負責的人不在了。系統的處理方式是指派一位監護人。孤兒行程就是一個仍在執行、而它的父行程已經終止的行程;它失去了原本的父行程,但並未被遺棄,因為作業系統給了它一個新的。
當父行程在它的某個子行程仍在執行時退出,那個子行程就成了孤兒。作業系統不會讓它沒有父行程:它把孤兒重新歸屬到 init 行程(PID 1),由它成為子行程的新父行程。孤兒照常執行、不受影響,但現在若你查它父行程的 PID,會看到 1。這種重新歸屬至關重要,因為涉及清理職責:當孤兒最終結束時,必須有某個父行程回收它,而 init 作為養父,執行那次回收,使孤兒不致成為永久的殭屍。
孤兒很常見,通常無害——只要一個長時間執行的子行程活得比「啟動它的直譯器或程式」更久,孤兒就自然產生。要釐清的關鍵對比是孤兒與殭屍。孤兒仍然活著(執行中),但它的父行程先死了;殭屍則已經死了(終止),但尚未被父行程回收。兩者有時相關:一個之後終止的孤兒本會成為殭屍,只是它的養父 init 會迅速回收它,所以實務上被收養的孤兒都被乾淨地清理掉。
你從命令列直譯器啟動一個長時間執行的背景工作,然後關閉直譯器。工作繼續執行,但它的父行程(直譯器)不在了,於是它被重新歸屬到 init;此時查它會顯示父行程 PID 為 1。
失去父行程就被 init 收養,而非被遺棄。
別把孤兒與殭屍搞混。孤兒仍在執行但父行程先死;殭屍已經終止但尚未被回收。
又稱
另見