什么是僵尸进程?


138

使用top基于和gui的命令,System Monitor我可以看到目前有几个僵尸进程。

什么是僵尸进程?

它们是否会影响僵尸所针对的系统或应用程序的性能。他们使用过多的内存还是根本没有使用任何内存?


39
它们是想要吃掉CPU的过程;)
Luis Alvarado

8
午餐... :)
RolandiXor

3
这些过程是死的,但不会埋葬。
Prateek Joshi 2015年

2
吃我的CPU?这真是太可怕了!
哈佛Geithus

Answers:


162

僵尸是DEAD进程。它们不能被“杀死”(您不能杀死DEAD)。所有进程最终都会死亡,并且一旦完成,它们就会变成僵尸。它们几乎不消耗资源,这是预料之中的,因为它们已经死了!造成僵尸的原因是僵尸的父级(进程)可以检索僵尸的退出状态和资源使用情况统计信息。父级使用wait()系统调用之一向操作系统发出信号,通知它不再需要僵尸。

进程死亡时,其所有子进程都将成为进程号1(即初始化进程)的子进程。初始化总是``等待''着孩子的死亡,这样他们就不会成为僵尸了。

如果您有僵尸进程,则意味着这些僵尸尚未由其父级等待(请查看上显示的PPID ps -l)。您有三个选择:修复父进程(使其等待);杀死父母 或忍受它。请记住,使用它并不难,因为僵尸在ps输出中仅占用多于一行。

通过在STAT列中出现“ Z”,可以在Unix ps命令的输出中识别出僵尸。存在时间短的僵尸通常表示父程序中存在错误。与其他泄漏一样,少量僵尸本身并不令人担心,但可能表明在重负载下该问题会变得越来越严重。

要从系统中删除僵尸,可以使用kill命令将SIGCHLD信号手动发送给父级。如果父进程仍然拒绝收割僵尸,则下一步将是删除父进程。当进程失去其父级时,init会成为其新的父级。Init定期执行wait系统调用,以将init作为父级的所有僵尸都收割。

也有一些孤立进程,这些孤立进程是其父进程已完成或终止的计算机进程。

当客户端进程在向服务器发出请求后崩溃时,进程可能会在远程调用期间变得孤立。

孤儿浪费服务器资源,并有可能使服务器陷入困境(这是僵尸和孤儿之间最大的资源区别(除非您看到一些孤儿僵尸电影)。但是,有几种解决孤儿进程问题的方法:

  1. 消灭是最常用的技术。在这种情况下,孤立进程被杀死。

  2. 转世是一种技术,其中机器定期尝试定位任何远程计算的父级;在这一点上,孤立的进程被杀死。

  3. 到期是一种技术,其中每个进程在被杀死之前都分配了一定的时间来完成。如果需要,可以在分配的时间到期之前“询问”更多时间来完成。

也可以孤立一个进程与其父进程在同一台计算机上运行。在类似UNIX的操作系统中,任何孤立的进程都会被特殊的“ init”系统进程立即采用。此操作称为重新父母,并自动发生。即使从技术上说,该进程将“ init”进程作为其父进程,但由于最初创建该进程的进程已不存在,因此仍称为孤立进程。

更多信息:

http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9vojU

http://www.linuxsa.org.au/tips/zombies.html

http://www.brighthub.com/computing/linux/articles/79186.aspx

当系统挂起并对用户输入做出缓慢反应时,如何识别并消除挂起过程?

从局域网中的Windows计算机远程杀死Ubuntu计算机中正在运行的进程


18
kh!您可以杀死死者!您只需要瞄准头部。还是他们一直在骗我们?
马辛·卡明斯基

1
init要求wait它的所有子进程是僵尸,孤儿(已收养)还是生物学(自产)?
2013年

1
符合 以地球末日战使用伪装:P
عثمانغني

请给@MarcinKaminski奖章!
安德里亚(Andrea)2016年

20

僵尸进程(也显示为<defunct>)根本不是真正的进程。它们只是内核进程表中的条目。这是他们消耗的唯一资源。它们不消耗任何CPU或RAM。拥有僵尸的唯一危险是进程表空间不足(您可以cat /proc/sys/kernel/threads-max用来查看系统上允许有多少个条目)。

它们仅在其父进程(即fork()'ed它们所在的进程)处于活动状态但尚未调用wait()系统功能时显示。一旦父母死亡,僵尸是wait()'ed通过init和消失。


4
top`截图在这个问题似乎矛盾吗?在那里,僵尸似乎使用了1个CPU的100%,但没有内存。
2011年

7

child process终止时,将其死亡通知给其父级,以便父级可以采取一些适当的措施。

一个process正在等待它的父接受它的返回码被称为僵尸进程

他们有completed their execution,但仍然有一个entryprocess table


1

僵尸进程是已停止运行的进程,但它们的进程表条目仍然存在,因为父进程尚未通过wait syscall检索到它。从技术上讲,每个终止过程在很短的时间内都是僵尸,但它们可以生存更长的时间。

当子进程完成后父进程不调用wait syscall时,将出现更长寿的僵尸进程。发生这种情况的一种情况是,当父进程的编写不佳,仅忽略了wait调用,或者当父进程在子进程之前死亡而新的父进程没有对其调用wait时。当进程的父进程在子进程之前死亡时,操作系统会将子进程分配给“ init”进程或PID1。即,init进程“采用”子进程并成为其父进程。这意味着现在子进程退出时,新的父进程(init)必须调用wait来获取其退出代码,否则其进程表条目将永远保留并成为僵尸

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.