Zombie Process 是 *nix 中一種特別的 process status
剛剛寫完了 [*nix] Resources Monitor: Top Command 這篇
本來想把 Zombie Process 一併寫進去
但想想內容篇幅,還是決定另開主題寫一篇
基本上來說 Zombie Process 就是當程序結束後,它的 exit status 沒有適當地被他的 parent process 處理,導致該 process 雖已結束,但 process 資料卻沒辦法完全的從記憶體中清除
在 Linux 上頭,當 Process 結束時,資料並不會馬上全部從記憶體中移除,他的 process descriptor 會留在記憶體中(佔用空間不多)
此時 Process 會變成 EXIT_ZOMBIE 的狀態,並發送 SIGCHLD signal 給 parent process
這時候 parent process 應該要呼叫 wait() system call 來讀取 child process 的 exit status 及其他資訊
在這個流程後,child process 才會被完全從記憶體清除
一般來說這個流程非常迅速,所以正常狀況下我們不太會在 top 指令中看到 zombie
然而,若 parent process 沒有正確呼叫 wait() system call,這些 zombie children 就會卡在 memory 之中了
Zombie 佔用的記憶體空間其實並不多
比較大的影響是 PID 在 Linux 中是有限的,而 zombie process 佔用了 PID 沒有被釋放
所以少數的 zombie process 是不影響系統的,除非 zombie process 不斷增加,耗盡了系統 PID
面對 zombie process 我們是無法透過 SIGKILL signal (kill -9) 來將其結束的,因為 zombie process 本來就是結束的狀態
我們的第一個方法是透過送 SIGCHLD 給 parent process 來處理
% kill -s SIGCHLD parent_pid
然而,在 parent process 不處理 SIGHLD 或設計不良下,這個方法是沒有效的
取而代之我們能做的是 kill parent process,此時 child process 就會變成孤兒,被 init process 接管 (init 成為新 parent)
這時 init 就會去做 wait() system call 來處理 zombie process 的 exit status 和其他資料,並清除掉 zombie process 了