僵死进程

来源:互联网 发布:360doc个人图书馆 知乎 编辑:程序博客网 时间:2024/04/30 01:12

Unix: 僵死(Zombie)进程

        进程在它的生命周期有几种状态:睡眠,可运行,停止,正在运行和僵死状态。所谓僵死进程,指的是一个进程已经退出,它的内存和相关的资源已经被内核释放 掉,但是在进程表中这个进程项(entry)还保留着,以便它的父进程得到它的退出状态。一个进程退出时,它的父进程会收到一个SIGCHLD信号。一般 情况下,这个信号的句柄通常执行wait系统调用,这样处于僵死状态的进程会被删除。如果父进程没有这么做,结果是什么呢?毫无疑问,进程会处于僵死状 态。实际上,僵死进程不会对系统有太大的伤害,最多就是它的进程号(PID)和进程表中的进程项系统不能使用。

        一个父进程fork了一个子进程出来,然后它们两个就各自执行自己的代码,在某一时刻,子进程退出了。但是此时子进程还有一定的空间并没有被操作系统回收。需要父进程使用wait系列的系统调用对该子进程进行回收,这样子进程就能够完全地从系统中消失。
所以僵尸进程就是说子进程在退出之后到被父进程回收之前的这段时间。

子进程死后,会发送SIGCHLD信号给父进程。

        一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程 是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他 进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,由于该信号的默认处理是忽略, 所以它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环, 不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。