是什么导致Linux上的僵尸进程?
写得不好的父进程可能不会调用该wait()创建子进程时, 函数。 这意味着没有任何东西在监视子进程中的状态变化,并且该SIGCHLD信号将被忽略。 或者,可能是由于不良的编程或恶意的意图,另一个应用程序正在影响父进程的执行。
但是,如果父进程不在子进程中监视状态变化,则不会发生适当的系统内务处理。 子进程终止时,不会删除PCB和进程表中的条目。 这导致僵尸状态永远不会从PCB上移除。
僵尸确实会占用一些内存,但通常不会造成问题。 进程表中的条目很小,但是在发布之前,进程ID无法重用。 在64位操作系统上,这不太可能引起任何问题,因为PCB比工艺表条目大得多。
可以想象,大量的僵尸可能会影响可供其他进程使用的内存量。 但是,如果您有那么多僵尸,那么父应用程序或操作系统错误就是一个严重的问题。
如何删除僵尸进程
您无法杀死僵尸进程,因为它已经死了。 它不会对任何信号做出响应,因为它已从内存中删除了-无处发送SIGKILL信号。 您可以尝试将 发送SIGCHLD信号 给父进程,但是如果子进程终止时它不起作用,那么现在也不大可能起作用。
唯一可靠的解决方案是杀死父进程。 终止时,其子进程将被该 继承init进程 ,这是在Linux系统中运行的第一个进程(其进程ID为1)。
该init进程定期执行必要的清理僵尸的操作,因此要杀死它们,您只需杀死创建它们的进程即可。 该top命令是查看是否有僵尸的便捷方法。
<