什么是 Linux 中的僵尸进程?


僵尸进程是指一个进程已经执行完毕,但其条目仍然存在于进程表中。僵尸进程通常发生在子进程中,因为父进程仍然需要读取其子进程的退出状态。一旦使用 wait 系统调用完成此操作,僵尸进程就会从进程表中删除。这被称为“回收”僵尸进程。

演示僵尸进程创建和终止的图表如下所示:

Zombie Process

僵尸进程的要点

与僵尸进程相关的一些要点如下:

  • 当进程使用 exit() 系统调用终止时,分配给该进程的所有内存和资源都会被释放。但是,该进程在进程表中的条目仍然可用。此进程现在成为僵尸进程。
  • 父进程可以使用 wait() 系统调用读取僵尸进程的退出状态。之后,僵尸进程将从系统中移除。然后,僵尸进程的进程 ID 和进程表条目可以被重用。
  • 如果父进程不使用 wait() 系统调用,则僵尸进程将保留在进程表中。这会导致资源泄漏。
  • 如果父进程不再运行,则僵尸进程的存在表明操作系统存在错误。如果僵尸进程数量很少,这可能不是一个严重的问题,但在负载较重的情况下,这可能会给系统带来问题,例如耗尽进程表条目。
  • 可以通过向父进程发送 SIGCHLD 信号(使用 kill 命令)将僵尸进程从系统中移除。如果父进程仍然没有从进程表中删除僵尸进程,则如果可以接受,则终止父进程。

僵尸进程的危害

僵尸进程不使用任何系统资源,但它们确实保留了它们的进程 ID。如果存在大量僵尸进程,则所有可用的进程 ID 都被它们独占。这阻止了其他进程运行,因为没有可用的进程 ID。

如果它们的父进程不再运行,则僵尸进程的存在也表明操作系统存在错误。如果僵尸进程数量很少,这可能不是一个严重的问题,但在负载较重的情况下,这可能会给系统带来问题。

杀死僵尸进程

可以通过向父进程发送 SIGCHLD 信号(使用 kill 命令)杀死僵尸进程。此信号通知父进程使用 wait() 系统调用清理僵尸进程。此信号是使用 kill 命令发送的。演示如下:

kill -s SIGCHLD pid

在上面的命令中,pid 是父进程的进程 ID。

更新于:2020-06-23

19K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.