Lui*_*ado 178
僵尸是死进程。他们不能被“杀死”(你不能杀死死者)。所有进程最终都会死亡,当它们死亡时,它们会变成僵尸。他们几乎不消耗资源,这是意料之中的,因为他们已经死了!僵尸的原因是僵尸的父进程(进程)可以检索僵尸的退出状态和资源使用统计信息。父级通过使用wait()
系统调用之一向操作系统发出信号,表明它不再需要僵尸。
当一个进程死亡时,它的子进程都成为进程号 1 的子进程,也就是 init 进程。Init总是在等待孩子们死去,这样他们就不会成为僵尸。
如果您有僵尸进程,则意味着它们的父进程尚未等待这些僵尸进程(查看由 显示的 PPID ps -l
)。你有三个选择:修复父进程(让它等待);杀死父母;或与之共存。请记住,与它共存并不难,因为僵尸在 ps 的输出中只多占用了一行。
僵尸可以在 Unix ps 命令的输出中通过 STAT 列中是否存在“Z”来识别。僵尸存在时间超过短时间通常表明父程序中存在错误。与其他泄漏一样,一些僵尸的存在本身并不令人担忧,但可能表明问题在较重的负载下会变得严重。
要从系统中删除僵尸,可以使用 kill 命令手动将 SIGCHLD 信号发送到父级。如果父进程仍然拒绝收割僵尸,下一步将是删除父进程。当一个进程失去它的父进程时,init 成为它的新父进程。Init 会定期执行 wait 系统调用,以获取任何以 init 为父节点的僵尸。
还有孤儿进程,它们是其父进程已完成或终止的计算机进程。
当客户端进程在向服务器发出请求后崩溃时,进程可能在远程调用期间成为孤立的。
孤儿浪费服务器资源并可能使服务器陷入困境(这是僵尸和孤儿之间最大的资源差异(除非您看到一些孤儿僵尸电影)。但是有几种解决孤儿进程问题的方法:
灭绝是最常用的技术;在这种情况下,孤儿进程被杀死。
轮回是一种技术,其中机器定期尝试定位任何远程计算的父项;此时孤立进程将被杀死。
过期是一种技术,其中每个进程在被杀死之前都被分配了一定的时间来完成。如果需要,进程可能会“要求”更多时间在分配的时间到期之前完成。
进程也可以孤立地运行在与其父进程相同的机器上。在类 UNIX 操作系统中,任何孤立的进程都会立即被特殊的“init”系统进程采用。此操作称为重新养育并自动发生。尽管从技术上讲该进程将“init”进程作为其父进程,但它仍然被称为孤儿进程,因为最初创建它的进程不再存在。
更多信息:
var*_*tec 22
僵尸进程(也显示为<defunct>
),根本不是真正的进程。它们只是内核进程表中的条目。这是他们消耗的唯一资源。它们不消耗任何 CPU 或 RAM。拥有僵尸的唯一危险是进程表中的空间不足(您可以使用它cat /proc/sys/kernel/threads-max
来查看系统上允许有多少条目)。
它们只有在它们的父进程(即fork()'ed
它们所在的进程)还活着,但还没有调用wait()
系统函数时才会出现。一旦父母死亡,僵尸是wait()'ed
通过init
和消失。
当 achild process
终止时,它的死亡被传达给它的父母,以便父母可以采取一些适当的行动。
一个process
正在等待它的父接受它的返回码被称为僵尸进程。
他们有completed their execution
但仍然entry
在process table
.
归档时间: |
|
查看次数: |
179874 次 |
最近记录: |