【问题标题】:UNIX Zombies and DaemonsUNIX 僵尸和守护进程
【发布时间】:2011-11-09 06:01:04
【问题描述】:

我知道当一个进程没有很好地清理(它的资源没有被回收/回收)时,就会创建一个僵尸。调用 fork() 创建新进程后,父进程应始终在该进程上调用 waitpid 以清理它。

我还了解到,一个守护进程是通过 fork 一个本身由 fork 创建的子进程创建的,然后让该子进程死亡。显然,一旦您执行此操作,UNIX 中的 init 进程(pid #1)将接管该进程。

我想知道的是——据我所知,当父母去世时,它会自动清理孩子——那么僵尸最初是如何产生的?

其次,守护进程的父进程会死掉,那么为什么守护进程不被视为僵尸呢?

【问题讨论】:

  • 有人想对匿名投票和关闭请求发表评论吗?我觉得这是一个非常可靠的问题。
  • 可以说这更像是一个服务器故障问题,但进程管理与 *nix 编程有关,所以我认为它没有太大问题。
  • 父进程死亡的进程是孤儿,而不是僵尸。僵尸是“活死人”;孤儿可以成为社会中富有成效的成员。

标签: unix daemon zombie-process


【解决方案1】:

我想知道的是 - 据我所知,当父母去世时 自动清理孩子 - 那么僵尸是如何创建的 首先?

不,父级不会自动清理子级。每当一个进程终止时,它的所有子进程(运行中的或僵尸进程)都会被init 进程采用。

僵尸是已经终止的子进程,当它们的父进程还活着但还没有调用wait 来获取它们的退出状态时就存在了。如果父进程死了(并且没有调用wait),所有的僵尸子进程都被init 进程收养,并最终调用wait 来收割它们,因此它们从进程表中消失.

保留僵尸进程背后的想法是保留有关进程终止的适当数据结构,以防父进程通过wait 感兴趣。

其次,守护进程的父进程会死掉,那为什么不死呢? 守护进程被认为是僵尸?

守护进程的父进程死亡,但守护进程脱离控制终端并通过setsid系统调用成为进程组领导。

【讨论】:

  • 挑选 nits:除了进程 1 之外的所有进程都是子进程,僵尸只是“活死人”之一,一个已经死亡但其父进程尚未等待收集状态的进程尸体。僵尸是一个问题,因为它占据了进程表中的一个槽,直到尸体被清理(由原始父进程或如果父进程没有等待就死了则由系统)才能重用。在极端情况下(200,000 个僵尸),它们会严重拖慢系统速度。今年早些时候我遇到了这个问题:系统进程每分钟三个僵尸。操作系统更新!
  • 对这个不错的答案再补充一点:保留僵尸的一个原因是,在父进程处理完终止消息之前,不应重用 PID。
【解决方案2】:

好吧,当子进程启动时,会在内核级别创建条目及其父进程 ID。由于任何原因(服务器手,父进程从应用程序端杀死等)父进程被杀死而子进程离开。内核无法清理此类进程。只有父进程被授权这样做。因为这样的进程仍然在内核的一个表中,所以它也在消耗资源但什么也不做。所以,它被称为僵尸。

【讨论】:

  • 在早期版本的 Solaris 中,只有父进程有权清理子进程,但如果父进程死亡,则从 Solaris 11 init 进程清除所有僵尸进程本身。
猜你喜欢
  • 2011-09-19
  • 2013-08-02
  • 2021-05-11
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多