gpt4 book ai didi

c - 僵尸进程与孤儿进程

转载 作者:太空狗 更新时间:2023-10-29 16:18:18 28 4
gpt4 key购买 nike

当父进程在子进程死亡后不使用 wait 系统调用来读取其退出状态时,就会创建 Zombie,而孤儿进程是当原始父进程在子进程之前终止时由 init 回收的子进程。

在内存管理和进程表方面,这些进程的处理方式有何不同,特别是在 UNIX 中?

什么是僵尸或孤儿的创建可能对更大的应用程序或系统有害的示例或极端情况?

最佳答案

当一个子进程退出时,一些进程必须等待获取它的退出代码。该退出代码存储在进程表中,直到发生这种情况。读取该退出代码的行为称为“收割” child 。在 child 退出和收割之间,它被称为僵尸。 (当你想到它时,整个命名法有点可怕;我建议不要考虑太多。)

僵尸只占用进程表中的空间。它们不占用内存或 CPU。然而,进程表是一种有限的资源,过多的僵尸可以填满它,这意味着没有其他进程可以启动。除此之外,它们是令人讨厌的困惑,应该极力避免。

如果一个进程退出时 child 仍在运行(并且没有杀死它的 child ;这个比喻仍然很奇怪),那么这些 child 就是孤儿。孤儿立即被 init“收养”(实际上,我认为大多数人称之为“重新养育”,但“收养”似乎比喻更好)。孤儿只是一个过程。它将使用它使用的任何资源。说它根本不是“孤儿”是有道理的,因为它有 parent ,但我经常听到他们这么叫。

init 自动收获它的 child (领养或其他)。所以如果你不清理你的 child 就退出,那么他们就不会变成僵尸(至少不会超过片刻)。

但是长寿的僵尸是存在的。这些是什么?它们是尚未收获它们的现有过程的前 child 。进程可能挂起。或者它可能写得不好而忘记收割它的 child 。或者它可能重载并且没有解决它。管他呢。但由于某种原因,父进程继续存在(因此它们不是孤儿),并且它们没有被等待,所以它们在进程表中作为僵尸继续存在。

因此,如果您看到僵尸持续时间超过片刻,则意味着父进程出现问题,应该采取措施改进该程序。

关于c - 僵尸进程与孤儿进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20688982/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com