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

僵尸进程的要点
与僵尸进程相关的一些要点如下:
- 当进程使用 exit() 系统调用终止时,分配给该进程的所有内存和资源都会被释放。但是,该进程在进程表中的条目仍然可用。此进程现在成为僵尸进程。
- 父进程可以使用 wait() 系统调用读取僵尸进程的退出状态。之后,僵尸进程将从系统中移除。然后,僵尸进程的进程 ID 和进程表条目可以被重用。
- 如果父进程不使用 wait() 系统调用,则僵尸进程将保留在进程表中。这会导致资源泄漏。
- 如果父进程不再运行,则僵尸进程的存在表明操作系统存在错误。如果僵尸进程数量很少,这可能不是一个严重的问题,但在负载较重的情况下,这可能会给系统带来问题,例如耗尽进程表条目。
- 可以通过向父进程发送 SIGCHLD 信号(使用 kill 命令)将僵尸进程从系统中移除。如果父进程仍然没有从进程表中删除僵尸进程,则如果可以接受,则终止父进程。
僵尸进程的危害
僵尸进程不使用任何系统资源,但它们确实保留了它们的进程 ID。如果存在大量僵尸进程,则所有可用的进程 ID 都被它们独占。这阻止了其他进程运行,因为没有可用的进程 ID。
如果它们的父进程不再运行,则僵尸进程的存在也表明操作系统存在错误。如果僵尸进程数量很少,这可能不是一个严重的问题,但在负载较重的情况下,这可能会给系统带来问题。
杀死僵尸进程
可以通过向父进程发送 SIGCHLD 信号(使用 kill 命令)杀死僵尸进程。此信号通知父进程使用 wait() 系统调用清理僵尸进程。此信号是使用 kill 命令发送的。演示如下:
kill -s SIGCHLD pid
在上面的命令中,pid 是父进程的进程 ID。
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP