2011-09-02 89 views
8

據我所知,當一個進程沒有很好地清理(它的資源沒有被回收/收割)的時候,就會創建一個殭屍。在調用fork()創建一個新進程之後,父進程應該總是在該進程上調用waitpid來清理它。UNIX殭屍和守護進程

我也已經瞭解到,一個守護進程是通過分叉自己創建的一個孩子創建的,然後讓孩子死亡。很明顯,UNIX中的init進程(pid#1)會在您執行此操作後收集進程的保管。

我想知道的是 - 據我所知,當父母死亡時,它會自動清理孩子 - 那麼殭屍是如何在第一個地方創建的?其次,守護進程的父母會死亡,爲什麼守護進程不被認爲是殭屍?

+2

任何人想對匿名downvote和close請求發表評論嗎?我覺得這是一個非常穩固的問題。 –

+2

有人可能會認爲這更多是一個服務器故障問題,但流程管理與* nix編程有關,所以我沒有看到太多問題。 –

+0

父母死亡的進程是孤兒,而不是殭屍。殭屍是'活的死者';孤兒可以是社會的生產性成員。 –

回答

13

我想知道的是 - 因爲據我所知,當父母去世它 自動清理孩子 - 那麼,如何殭屍在第一時間拿到的地方創建 ?

不,父母不會自動清理孩子。每當進程終止時,其所有子進程(運行或殭屍)均被init進程採用。

殭屍是已經終止的子進程,當父進程還活着但尚未調用wait來獲得退出狀態時,它們就存在。如果父母死亡(並且沒有調用wait),所有殭屍孩子都被init進程採用,並且它最終會調用wait來收割它們,因此它們會從進程表中消失。

保持殭屍進程的想法是保持有關終止進程的適當數據結構,以防父母通過wait感興趣。

其次,守護進程的父母死亡,爲什麼不是 守護進程被認爲是殭屍?

進程化過程的父母死光,但守護進程的過程中從控制終端分離,並且變得經由setsid系統調用的處理組長。

+0

採摘尼特:除了過程1之外的所有過程都是子過程,而殭屍只是其中一個'活死人',一個已經死亡但其父母尚未等待收集屍體狀態的過程。殭屍是一個問題,因爲它佔據了進程表中的一個槽,在屍體清理完成之前(通過原始父進程或系統,如果父進程沒有等待就死掉),該進程表無法重用。在極端情況下(200,000殭屍),他們會嚴重拖慢系統。今年早些時候我遇到了這個問題:三個殭屍在系統進程中一分鐘。 O/S更新! –

+1

除了這個很好的答案之外,還有一個補充:保持殭屍的一個原因是PID不應該重用,直到父處理完終止消息。 – Drunix

0

那麼,當一個子進程啓動時,在內核級別創建的條目以及它的父進程ID。由於任何原因(服務器手,從應用程序結束時死亡的父進程等),父進程被終止並且子進程離開。內核無法清理這樣的進程。只有父母過程有權這樣做。因爲這樣的過程仍然在內核的表中,所以它也在吃資源,但什麼都不做。所以,它被稱爲殭屍。

+1

在早期版本的Solaris中,只有父進程被授權清理子進程,但是從Solaris 11 init進程清除所有殭屍進程本身(如果父進程已死亡)。 – sumana