Todo僵尸进程学习 & 进程状态列表

Posted 笨鸟居士的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Todo僵尸进程学习 & 进程状态列表相关的知识,希望对你有一定的参考价值。

参考这篇文章:

http://www.mike.org.cn/articles/treatment-of-zombie-processes-under-linux/

 

在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸。

 

如果他的父进程没安装SIGCHLD信号处理函数,也没有调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。

 

僵尸进程的避免

  1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起

  2、如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收

  3、如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号

  4、还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。

 

子进程结束后为什么要进入僵尸状态?

  因为父进程可能要取得子进程的退出状态等信息。

 

S(state of the process )

  O:进程正在处理器运行 
  S:休眠状态(sleeping)
  R:等待运行(runable)   
  I:空闲状态(idle)
  Z:僵尸状态(zombie)   
  T:跟踪状态(Traced)
  B:进程正在等待更多的内存页
  C:cpu利用率的估算值(cpu usage)

 

kill -18 PPID (PPID是其父进程)

 

以上是关于Todo僵尸进程学习 & 进程状态列表的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记——孤儿进程和僵尸进程

僵尸进程和孤儿进程

linux僵尸进程产生的原因以及如何避免产生僵尸进程

Linux入门进程概念(超详解,建议收藏)

Linux入门进程概念(超详解,建议收藏)

linux的活动进程中有个zombie是啥