僵尸进程

操作系统中有各种各样的进程,孤儿进程指的是 Parent进程 死掉后的进程。那么僵尸进程(Zombie Process)是什么进程呢难道会将其他进程吃掉?

进程的生命周期

学过操作系统的同学都十分清楚进程的生命周期,即Created(创建)、Ready(就绪)、Running(运行)、Blocked(阻塞)、 Terminated(终止). 这五种状态之间的切换如下图所示
nibTpt.png

僵尸进程

在Linux/Unix中,僵尸进程其实是进程生命周期的一个状态,是一个没有正常退出的进程。

特点

僵尸进程是一个执行完任务的进程,但是在操作系统中任然保留着该进程的PCB块(即进程表)。僵尸进程的存在会消耗大量的系统资源。

起源

当进程执行完毕以后,进程将进入 Termated State, PCB块仍然存在,知道父进程读取了子进程的执行状态以后(即wait调用),PCB块才会被删除——这在内核中称为reaped,僵尸进程是进程被收割之前的毕竟之路。
在常规的操作系统中,僵尸进程会被wait,然后资源将被操作系统回收。
如果一个进程派生了子进程,子进程执行完毕,此时父进程没有调用wait获取子进程的状态,此时子进程的PCB将一直保留在系统中,造成资源泄露。

杀死僵尸

由于僵尸进程是已经退出的进程, kill命令对僵尸进程无能为力。

  1. 父进程需要对死亡的子进程收尸,防止其成为僵尸。父进程需要接管SIGCHLD信号,子进程结束后,会发送SIGCHLD信号给父进程,父进程执行waitpid()清理僵尸进程
  2. 将父进程杀死,父进程死亡后,僵尸进程将变成孤儿进程,init进程将会负责清理僵尸进程,那么僵尸进程也随着消失
Author: lisupy
Link: http://lisupy.github.io/2019/09/02/僵尸进程/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
支付宝打赏
微信打赏