1、什么是僵尸进程和孤儿进程:

在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等,但是留下一个称为僵尸进程的数据结构,这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间),这些信息直到父进程通过 wait()/waitpid() 来取时才释放。这样设计的目的主要是保证只要父进程想知道子进程结束时的状态信息,就可以得到

  • 僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。

  • 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养,并由 init 进程对它们完成状态收集工作。

2、僵尸进程与孤儿进程的问题危害:

僵尸进程虽然不占有任何内存空间,但如果父进程不调用 wait() / waitpid() 的话,那么保留的信息就不会释放,其进程号就会一直被占用,而系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程,此即为僵尸进程的危害。

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了 init 进程身上,init 进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init,而 init 进程会循环地 wait() 它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init 进程就会出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

如果子进程在 exit() 之后,父进程没有来得及处理,这时用 ps 命令就能看到子进程的状态是“Z”。如果父进程能及时处理,可能用 ps 命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出,则子进程将由 init 接管。init 将会以父进程的身份对僵尸状态的子进程进行处理。

3、如果解决僵尸进程造成的问题:

(1)方案一:父进程通过 wait 和 waitpid 等函数等待子进程结束,但这会导致父进程挂起,所以这并不是一个好办法,父进程如果不能和子进程并发执行的话,那我们创建子进程的意义就没有。同时一个 wait 只能解决一个子进程,如果有多个子进程就要用到多个 wait

(2)方案二:通过信号机制:

子进程退出时,向父进程发送 SIGCHILD 信号,父进程处理 SIGCHILD 信号,在信号处理函数中调用 wait 进行处理僵尸进程。

(3)方案三:fork两次:

原理是将进程成为孤儿进程,从而其的父进程变为 init 进程,通过 init 进程处理僵尸进程。具体操作为:父进程一次 fork() 后产生一个子进程随后立即执行 wait(NULL) 来等待子进程结束,然后子进程 fork() 后产生孙子进程随后立即exit(0)。这样子进程顺利终止(父进程仅仅给子进程收尸,并不需要子进程的返回值),然后父进程继续执行。这时的孙子进程由于失去了它的父进程(即是父进程的子进程),将被转交给Init进程托管。于是父进程与孙子进程无继承关系了,它们的父进程均为Init,Init进程在其子进程结束时会自动收尸,这样也就不会产生僵死进程了

(4)方案四:kill 父进程:

严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们寻求如何消灭系统中大量的僵死进程时,答案就是把产生大量僵死进程的那个元凶枪毙掉(也就是通过 kill 发送 SIGTERM 或者 SIGKILL 信号啦)。枪毙了元凶进程之后,它产生的僵死进程就变成了孤儿进 程,这些孤儿进程会被 init 进程接管,init 进程会 wait() 这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经僵死的孤儿进程就能瞑目而去了。

参考文章:

https://www.cnblogs.com/Anker/p/3271773.html

https://www.cnblogs.com/jian-99/p/7739369.html

什么是僵尸进程与孤儿进程相关推荐

  1. 启动进程 问号_有两个这样的进程:僵尸进程amp;孤儿进程,蓝瘦香菇

    进程 先来说下什么是进程: 来看下百度是怎么说的: 光看说的不够形象,在windows系统中,它长这样: 在Mac系统中,它长这样: Linux中是这样的:(有点长截图一部分好了) [root@iz2 ...

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

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

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

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

  4. python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程

    一.python如何使用多进程 创建子进程的方式 1.导入multiprocessing 中的Process类 实例化这个类 指定要执行的任务 target import os from multip ...

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

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

  6. 僵尸进程和孤儿进程 转载

    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程使用f ...

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

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

  8. php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡

    声明:维基百科上没有僵死进程的词条,这里认为僵死进程同僵尸进程,即ZOMBIE. 一.定义 什么是僵尸进程 维基百科的定义:在类UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生 ...

  9. Linux系统编程--3(exec 函数族,僵尸进程和孤儿进程,wait和wait_pid回收子进程)

    exec 函数族 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支) ,子进程往往要调用一种 exec 函数以执行另一个程序.当进程调用一种 exec 函数时,该进程的用户 ...

最新文章

  1. javascript如何释放内存
  2. java.library.path hadoop_关于java:Hadoop“无法为您的平台加载本机Hadoop库”警告
  3. python变量和字符串
  4. c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...
  5. 跟我学ModelArts丨探索ModelArts平台个性化联邦学习API
  6. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
  7. html可折叠边栏,html – 仅使用CSS的可折叠灵活宽边栏
  8. Python语言学习 (六)1.2
  9. [mstsc]解决win8 win10 平板无法被mstsc连接的问题
  10. 订单管理系统哪种简单好用?
  11. laravel响应速度慢
  12. ​让人脉关系暴增的10个方法
  13. Python数据处理课程设计-房屋价格预测-代码
  14. 直入樱花深处,静待落英满襟
  15. 传统运维与云运维到底有什么不同呢?
  16. 独家专访 | 获得软银巨额投资的 Mapbox,要如何为自动驾驶提供地图服务?
  17. 显示error 1044错误代码
  18. html网站模版用什么修改,网站后台模版html如何修改?网站模板能随便更改吗?...
  19. (7-3)重要的话说三遍 (5分) 你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。 注意每遍占一行,除了每行的回车不能有任何多余符
  20. 运筹说 第26期 | 2022泰晤士世界大学排名出炉!中国八校首次上榜,快看有没有你学校!

热门文章

  1. 关于VS无法启动程序,系统找不到指定的路径,最标准的回答
  2. 【Python金融量化 1- 100 】三、流行股票指数
  3. Swin Transformer升级版来了!30亿参数,刷榜多项视觉任务
  4. 本周六锁定成都!解析百度文心(ERNIE)如何助力快速定制企业级NLP模型
  5. 区别于传统低效标注,两种基于自然语言解释的数据增强方法
  6. 低精度神经网络:从数值计算角度优化模型效率
  7. kux格式怎么转换成mp3_把MP3格式的音频转换成WAV格式
  8. java 8u111 8u112_JDK 8U112
  9. 云原生系列「五」我为啥又看上了serviceMesh?
  10. idea中启动RunDashboard