操作系统中有各种各样的进程,孤儿进程指的是 Parent进程 死掉后的进程。那么僵尸进程(Zombie Process)是什么进程呢难道会将其他进程吃掉?
进程的生命周期
学过操作系统的同学都十分清楚进程的生命周期,即Created(创建)、Ready(就绪)、Running(运行)、Blocked(阻塞)、 Terminated(终止). 这五种状态之间的切换如下图所示
僵尸进程
在Linux/Unix中,僵尸进程其实是进程生命周期的一个状态,是一个没有正常退出的进程。
特点
僵尸进程是一个执行完任务的进程,但是在操作系统中任然保留着该进程的PCB块(即进程表)。僵尸进程的存在会消耗大量的系统资源。
起源
当进程执行完毕以后,进程将进入 Termated State, PCB块仍然存在,知道父进程读取了子进程的执行状态以后(即wait调用),PCB块才会被删除——这在内核中称为reaped,僵尸进程是进程被收割之前的毕竟之路。
在常规的操作系统中,僵尸进程会被wait
,然后资源将被操作系统回收。
如果一个进程派生了子进程,子进程执行完毕,此时父进程没有调用wait
获取子进程的状态,此时子进程的PCB将一直保留在系统中,造成资源泄露。
杀死僵尸
由于僵尸进程是已经退出的进程, kill命令对僵尸进程无能为力。
- 父进程需要对死亡的子进程收尸,防止其成为僵尸。父进程需要接管SIGCHLD信号,子进程结束后,会发送SIGCHLD信号给父进程,父进程执行
waitpid()
清理僵尸进程 - 将父进程杀死,父进程死亡后,僵尸进程将变成孤儿进程,
init
进程将会负责清理僵尸进程,那么僵尸进程也随着消失