僵尸进程

Posted on 2018-07-30 20:31  黑企鹅  阅读(66)  评论(0编辑  收藏  举报

僵尸进程的产生:

当一个进程创建了一个子进程时,他们的运行是异步的。父进程不知道子进程什么时候结束,如果父进程很繁忙来不及wait 子进程时,那么当子进程结束时,就会变成僵尸进程。在一个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但是仍然保留了一些信息(如进程号pid 退出状态 运行时间等)。这些保留的信息直到进程通过调用wait/waitpid时才会释放。这样就导致了一个问题,如果没有调用wait/waitpid的话,那么保留的信息就不会释放。比如进程号就会被一直占用了。但系统所能使用的进程号的有限的,如果产生大量的僵尸进程,将导致系统没有可用的进程号而导致系统不能创建进程。

 思考一个问题:如果一个子进程变成了僵尸进程,但是父进程在这之后来不及调用wait就结束了,那么这个僵尸进程该怎么处理?

在那种情况下,即子进程结束了但父进程还在继续运行(并未调用wait/waitpid)这段期间,假如父进程异常终止了,那么该子进程就会自动被init接管。那么它就不再是僵尸进程了。应为intit会发现并释放它所占有的资源。(当然如果进程表越大,init发现它接管僵尸进程这个过程就会变得越慢,所以在init为发现他们之前,僵尸进程依旧消耗着系统的资源)