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

但如果不规范的编写程序,就可能导致系统产生孤儿进程/僵尸进程。

父/子进程执行的流程

父/子进程执行的流程执行图

孤儿进程/僵尸进程

1、孤儿进程:子进程执行完毕时发现父进程已退出,子进程变成为了孤儿进程。孤儿进程后期会被系统的 init 进程接管,并 wait/waitpid 其执行状态做回收处理。对系统并无危害。

2、僵尸进程:子进程执行完毕时发现父进程未退出,会向父进程发送 SIGCHLD 信号。但父进程没有使用 wait/waitpid 或其他方式处理 SIGCHLD 信号来回收子进程,子进程变成为了对系统有害的僵尸进程。

僵尸进程无法被系统有效的回收,ps 查看时状态为 Z 的即为僵尸进程,或 top 命令可直接看到 zombie 的个数。僵尸进程的父进程此时一定仍在运行,产生僵尸进程的元凶其实是他们的父进程杀掉父进程,僵尸进程就变为了孤儿进程,便可以转交给 init 进程回收处理。

多进程编程

多进程开发中,我们无法统一确信父进程会先于任何子进程退出,或者不少场景父进程在创建子进程后并不会退出。这就使得我们要在父进程中处理子进程的 SIGCHLD 信号,否则就有可能产生僵尸进程。

用 PHP 来实现一个较为标准的多进程模型。

wait/waitpid 函数会阻塞父进程等待子进程发送 SIGCHLD 信号,父进程处理并回收对应的子进程,当所有的子进程回收完毕后,即 workers_pid 数组为空时,主进程正常退出即可。

形象的理解下:

父进程作为子进程的监护人,在子进程运行结束后负责清理和回收相关资源是理所当然的。

子进程在运行结束时会告诉父进程,我运行完了,把我回收掉吧,腾出地儿来。

父进程可以通过 await/awaitpid 收到子进程运行结束的信号 SIGCHLD,并回收子进程。

可有些父进程不负责任,丢下子进程直接跑掉了,子进程便成了孤儿进程,这时福利院长 init 便过来接管收留了这些子进程,让它们成为了自己的孩子,耐心的倾听它们何时执行完毕,把它们回收。

有些父进程更过分,虽然没跑路,但堵住了自己负责监听 SIGCHLD 信号的耳朵,子进程根本没办法喊应它,就变成了僵尸进程。init 看到父进程还在那,自己也不能过去接管。如果父进程一会儿突然跑掉了,那 init 可以过去接管这些子进程,因为此时这些子进程已经没有监护人,他们是孤儿进程了,init 可以接管它们。但如果父进程一直不走,那这些僵尸子进程就会一直在那里呆着占用着系统资源。

补充

1、父进程退出时子进程仍在运行,则会使得子进程变为孤儿进程,系统的 pid 为 1 的 init 进程 将会接管这些孤儿进程,待其运行结束后回收资源。

2、子进程退出时父进程仍在运行,且父进程没有对子进程发送的 SIGCHLD 信号进行处理(通常我们是调用 wait/waitpid 进行处理的),则会使得子进程成为僵尸进程 zombie,僵尸进程会继续占用系统资源。若父进程稍后退出,则僵尸进程会转为孤儿进程,进入 1 的处理流程。若父进程处于长期运行状态,则这些占用系统资源的僵尸进程会降低系统性能。

专注于技术热点大数据,人工智能,JAVA、Python、 C 、GO、Javascript等语言最新前言技术,及业务痛点问题分析,请关注【编程我最懂】共同交流学习。

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

  1. java 僵尸进程_神奇的Java'僵尸'进程问题

    神奇的"僵尸"进程问题(java defunct) 现象描述 大概1个月多以前 在启动脚本中增加了tail -f 用来启动后追踪日志判断是否启动成功 后发现无法执行shutdown ...

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

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

  3. python僵尸进程和孤儿进程_进程3.0——进程状态与僵尸进程、孤儿进程

    进程3.0--进程状态与僵尸进程.孤儿进程 进程状态 一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程.进程状态即体现一个进程的生命状态 一般来说,进程有五种状态:创建状态:进程在创建时需 ...

  4. Linux | 进程概念、进程状态(僵尸进程、孤儿进程、守护进程)、进程地址空间

    文章目录 进程和程序 操作系统如何控制和调度程序 进程控制块–PCB 子进程 进程状态 僵尸进程 孤儿进程 守护进程(精灵进程) 进程地址空间 引言 页表 进程和程序 程序: 一系列有序的指令集合(就 ...

  5. linux mysql 僵尸进程_linux shell中清理僵尸进程

    今天登录到服务器上时,系统打印有6 zombie processes存在,于是用kill -9去清理掉这些僵尸进程,命令执行完后没有错误,可是再次查找时,发现僵尸进程仍然存在,不知道怎么清理了,上网找 ...

  6. php apache 多进程,php多进程 防止出现僵尸进程 如何 使 apache 成为 僵尸进程

    php pcntl 僵尸进程怎么产生的一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退 ...

  7. Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)

    进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...

  8. 进程的退出方式以及僵尸进程和孤儿进程

    (1)正常退出 (2)异常退出 检查wait和waitpid所返回的终止状态的宏 宏 说明 WIFEXITED(status) 若为正常终止子进程返回的状态,则为真.对于这种情况可执行WEXITSTA ...

  9. 关于进程(PCB | 父进程 | 子进程 | fork深层探讨 |僵尸进程与孤儿进程)

    文章目录 一.进程与PCB 1. 进程的概念: 2. 什么是PCB task_struct task_ struct内容分类 4. 查看进程 5. 进程概念的加深 二.父进程与子进程 1. 通过系统调 ...

最新文章

  1. R语言临床诊断试验的ROC分析方法示例
  2. java h5获取ip,websocket中获取客户端通信的真实IP
  3. android布局的作用,Android UI布局经验总结
  4. 7-104 6翻了 (15 分)
  5. 主动訪问用户数据的背后是品牌战略
  6. ENVI实验教程(8)实验八、高光谱与光谱分析
  7. 推荐系统(7):推荐算法之基于协同过滤推荐算法
  8. 虚拟环境中用Anaconda安装显卡CUDA驱动与CUDA运行版本匹配
  9. (vivo)安卓神器xposed框架Root安装指南
  10. php验证码显示不了,PHP验证码无法显示的原因及解决办法
  11. 360全景倒车影像怎么看_360全景影像和倒车影像有什么区别
  12. Linux查看开机自动运行的服务
  13. Inspiron光驱改装固态硬盘_Win10系统安装
  14. 宝付揭秘高炮贷款借贷渠道
  15. 水晶报表10的下载地址及注册码
  16. ipad服务器的显示器,Air Display怎么用 iPad怎么分屏显示 值得收藏
  17. 爱国者P8880,完美展示!
  18. 171029 windows10 桌面美化
  19. 华盛顿大学西雅图 计算机科学 申请条件,华盛顿大学西雅图分校研究生申请条件有哪些?...
  20. bistoury建库建表(一)

热门文章

  1. 微课|中学生可以这样学Python(5.6.1节):列表推导式2
  2. Python+numpy实现蒙特卡罗方法估计圆周率近似值
  3. Linux 线程池的概念与实现
  4. 一个完整网页代码HTML和CSS,第一个网页(HTML/CSS)
  5. 怎样查一个文件被复制了几次_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...
  6. 有数据库文件怎么连接到服务器,怎么连接到服务器中的数据库
  7. 比豆二机器人好的机器人_扫地机器人和吸尘器哪个好
  8. w10无法连到家庭组计算机,一键W10装机版无法进入家庭组如何处理
  9. php多级查询,MySQL 多级查询
  10. 2018你那计算机考试新题型,2018考研新题型考察点和解题步骤