
174
|
第五章
殭屍行程
如同稍早所討論的,一個已經終止的行程,如果尚未被其父行程檢查過狀態,稱為殭屍
行程(zombie)。殭屍行程會繼續消耗系統資源,儘管只佔用比例很小的系統資源(僅
夠維持該行程原本的骨架)。有這些資源被保留著,想要檢查其子行程之狀態的父行
程,才有辦法取得與這些行程之生死有關的資訊。一旦父行程這麼做之後,核心才會完
全清除該行程,於是殭屍行程便不復存在。
然而,任何長時間使用 Unix 的人必定都曾看過無所事事的殭屍行程。這些行程,常稱
為
鬼魂行程
(
ghost
),肇因於不負責任的父行程。如果你的應用程式派生(fork)了一
個子行程,你的應用程式有責任(除非它很短命,正如你馬上會看到的)等待其子行
程,即使它僅僅是丟棄所收集到的資訊。否則,你的行程的所有子行程將成為無所事事
的鬼魂行程、擠滿系統的行程清單,以及讓用戶對你的應用程式的草率實作感到不滿。
然而,如果父行程的死亡(終止)在子行程之前,或者如果在它死亡之前有機會等待它
的殭屍子行程?每當有一個行程終止時,Linux 核心會把它的所有子行程重新指定給 init
行程(pid 值為 1 的行程)。如此可確保每個行程都會具有一個直接的父行程。接著,
init 行程會週期性地等待它的所有子行程,如此可確保殭屍行程不會停留太久的時間—
不會有無所事事的鬼魂行程!因此,如果一個父行程的死亡在子行程之前,或是沒有在
結束之前等待它的子行程,這些子行程最後會重新指定給 init 行程,由它負責等待,這
讓它們得以全部結束。此做法被認為是一個好的實務作為,有了這個保障 ...