1.孤儿进程和僵尸进程

Unix/Linux中有孤儿进程和僵尸进程的概念如下:

  • 孤儿进程:如果父进程退出而它的一个或多个子进程还在运行,那么这些子进程就被称为孤儿进程。孤儿进程最终将被 init 进程所收养并由 init 进程完成对它们的状态收集工作。
  • 僵尸进程:一个进程使用 fork() 创建子进程,如果子进程退出而父进程并没有调用 wait() 或者 waitpid() 获取子进程信息,那么子进程的描述符仍然保存在系统中。这种进程称为僵尸(zombie)进程,也译僵死进程。
  • 孤儿进程没有危害。僵尸进程有危害。僵尸进程占用资源不放,正常进程可能无法进行创建。
  • 解决僵尸进程只能找到那个产生大量僵死进程的父进程,只有杀死掉那个父进程 (通过 kill 发送 SIGTERM 或 SIGKILL) 杀死掉那个父进程之后,那些僵死进程就成了孤儿进程,孤儿进程会被 init 进程接管,init 会 wait()掉这些孤儿进程并且释放它们在系统中占用的资源这些僵死的孤儿进程就会死去。

2. 浮想联翩

孤儿进程和僵尸进程让我联想到JVM学到的内存泄漏和内存溢出。准确的说是僵尸进程和内存泄漏有一定的相似性。

  • 僵尸进程:虽然存在(进程描述符仍然保存在系统中),但属于占着茅坑不拉屎的玩意,还对系统有害导致正常的进程无法创建。
  • 内存泄漏:已分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等后果。
    两者都是因为某种原因导致进程所占用的资源无法正常被释放,最终导致一系列恶果。(o゜▽゜)o☆建立了一个桥梁联通JVM和Linux,又多了可以吹的点了~

3.Linux进程控制相关

3.1 基本概念

  unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。而Linux进程共同的先祖就是init进程。
  子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 unix/linux提供了这样的一个机制,保证只要父进程想知道子进程结束时的状态信息, 就可以得到。
  该机制是在每个进程退出的时候,内核释放该进程所有的资源,如占用的内存等, 但是仍然为其保留一定信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放,但这样也会就导致了一些问题。

3.2 存在的问题

  如果父进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但系统能使用的进程号是有限(如Linux0.11内核最多支持64个进程),如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.这就是僵尸进程的危害。

  任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下task_struct(PCB)1的数据结构,等待父进程处理,这是linux进程转换约定流程,如下图,Linux进程最终从内核运行态用exit()方法终止,进入僵尸状态。

  如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。

  如果父进程在子进程结束之前退出,则子进程将由init接管(就是孤儿进程),init将会以父进程的身份对僵尸状态的子进程进行处理。

  当然严格说,僵死进程并不是问题的根源,产生出大量僵死进程的那个父进程才是罪魁祸首,找到该父进程过kill发送SIGTERM或者SIGKILL信号干掉后该父进程的子进程就变成了孤儿进程了由init进程接管。

3.3 僵尸进程解决的几个问题

  • 信号机制:向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理
  • fork方法调用两次:原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。

图片出处见水印

STAT位常见状态字符,各个状态字符的解释,来自ps的man手册

D //无法中断的休眠状态(通常 IO 的进程);
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;

有额外的字符对进程的状态做补充说明:
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;



  1. 参考《A Heavily Commented Linux Kernel Source Code》2.5节 ↩︎

孤儿进程和僵尸进程个人总结相关推荐

  1. 孤儿进程与僵尸进程[总结]

    1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...

  2. java 僵尸进程_孤儿进程与僵尸进程

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

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

    1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...

  4. linux c之孤儿进程与僵尸进程[总结]

    转载地址:http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这 ...

  5. Linux系统编程(二)孤儿进程和僵尸进程

    Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...

  6. 函数wait、waitpid、孤儿进程、僵尸进程

    一.函数wait.waitpid 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着 ...

  7. python僵尸进程和孤儿进程_Python Web学习笔记之并发编程的孤儿进程与僵尸进程...

    1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...

  8. 快速理解孤儿进程和僵尸进程

    下面是我很久以前在读APUE(<Unix环境高级编程>)对孤儿进程和僵尸进程的理解,为了便于记忆,采用打比方的方式予以解释. (当然不一定精准,后面我会贴出wikipedia上的专业解释. ...

  9. vmware-vmx.exe无法结束进程_孤儿进程与僵尸进程产生原理分析,以及终极解决方案案例实现...

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  10. 【Linux】进程终止与进程等待/僵尸进程与孤儿进程

    进程终止:简单来说就是如何退出一个进程 在main函数中可以直接采用return退出(在普通函数中return只能退出函数而不能退出进程) 在函数任意位置调用 ==viod exit(int stat ...

最新文章

  1. Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
  2. 检查列表中是否存在值的最快方法
  3. button按钮无法提交表单问题发现与解决
  4. python交互式数据可视化_python数据可视化工具
  5. SAP UI5 的前世今生
  6. 我9月底的SAP Spartacus开发进展情况
  7. r中汇率市场_如何在Word 2013表中汇总行和列
  8. mybatis学习(33):动态sql if
  9. SQL Server JSON:性能手册
  10. 学习笔记(01):MySQL数据库运维与管理-02-设置系统变量
  11. Python实战之Selenium自动化测试web刷新FW
  12. html5中怎么实现外边框中嵌入字_Web前端有什么优点?Web前端怎么入门?
  13. 解决办法:GTK_OBJECT、GTK_SIGNAL_FUNC未声明
  14. 金额转换成人民币大写
  15. CDH踩坑记录之:熵不足
  16. 北京市社会保险个人权益记录(参保人员缴费信息)-社保定制
  17. pyqt制作简单的摄像头监控界面
  18. mysql 三阶多项式拟合,《统计学习导论-基于R应用》第三章:线性回归(代码)...
  19. 工作感受月记 201907月
  20. 计算机excel数据模板,excel表格范本

热门文章

  1. PyQt5_pyqtgraph股票执行策略标记买卖信号
  2. AI自动修复上色工具,视频修复工具年度特hui
  3. ASO优化之手游该如何获得巨量新增(下)
  4. 摆脱“卖一台赔一台”的魔咒,电动车制造商需要去哪里取取经?...
  5. 中国人民银行和公安部的联网核查公民身份信息系统存在bug
  6. 现在入门学习python前景如何?
  7. Screenlets的配置文件天文钟
  8. 备份一哈如屎一样的sql
  9. 【方向盘】认为:开发者已无理由再用Java EE
  10. 我今年二十三四岁(转)