2011年1月8日 星期六

Zombie process 的說明

發完上篇後, 看到 freedom 和 command 回說 Zombie 反而是最常見 process 殺不掉的情況。於是又複習了一下 Zombie 相關說明, 摘要一下:
  • process 結束後要等 parent process 讀取它的 exit status 才能結束, 在那之前, 會進入 Zombie 狀態 (ps 顯示 Z)。
  • Zombie 不會占用 memory, 只是在 process table 裡留筆記錄, 所以挺多會用光 process id 而無法新增 process。
  • Zombie 不是 process, 自然也不能接受 signal, 所以無法 kill zombie (geek 的雙關笑話嗎...)。
避免 Zombie 的解法:
  • double fork, 也就是不直接將工作交給 child process, 而是先 fork child process, 讓它再 fork 出 "child child process"。接著 parent process 會 wait child process, 而 child process 不等待 "child child process" 直接結束, 所以 parent process 也不會等多久就能繼續做事。依 Unix 的設計, 因為 "child child process" 的 parent process 掛了, 它會自動被 init 接管, 而 init 會定期讀取 child process 的 exit status。
  • 另外就是 Wikipedia 上寫的, 我沒試過這招: 
    if the parent explicitly ignores SIGCHLD by setting its handler to SIG_IGN (rather than simply ignoring the signal by default) or has the SA_NOCLDWAIT flag set, all child exit status information will be discarded and no zombie processes will be left.
Btw, 用 Google 搜過去寫的 plurk, 還是比 plurk 內建搜尋方便啊, 剛搜 "fcamel double fork" 就找出一年多前寫的心得

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...