解析僵尸进程和孤儿进程

来源:互联网 发布:网络延迟怎么解决 编辑:程序博客网 时间:2024/06/07 02:15

大家都知道Linux中的进程分为多种状态,例如:
“R (running)”运行状态、
“S (sleeping)”睡眠状态(浅度睡眠)、
“D (disk sleep)”磁盘睡眠状态、
“T (stopped)”停止进程、
“X (dead)”死亡状态、
“Z (zombie)”僵死状态等等。
僵死状态是一个比较特殊的状态:当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收
现在我们来用代码模拟一下僵尸进程:
这里写图片描述
再来看一下运行结果:
这里写图片描述
孤儿进程:一个父进程退出后,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
来看一下孤儿进程的实现:
这里写图片描述
运行结果:
这里写图片描述
僵尸进程危害场景:
  例如有个进程,它定期的产生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是,父进程只管生成新的子进程,至于子进程 退出之后的事情,则一概不闻不问,这样系统运行上一段时间之后,系统中就会存在很多的僵死进程。
  倘若用ps命令查看的话,就会看到很多状态为Z的进程。 严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。
  那我们该如何消灭系统中大量的僵死进程呢?答案就是把产生大量僵死进程的那个元凶杀掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。杀掉元凶进程之后,它产生的僵死进程就变成了孤儿进程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经僵死的孤儿进程 就能瞑目而去了。

2 0
原创粉丝点击