2011-09-02 196 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