什么是僵尸进程与孤儿进程-程序员宅基地

技术标签: 面试  linux  操作系统  僵尸线程  孤儿线程  计算机网络+操作系统  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a745233700/article/details/120715371

智能推荐

解决问题:FileStream 将不会打开Win32设备(如磁盘分区和磁带机)。请避免在路径中使用“\\.\”_filestream 将不会打开 win32 设备(如磁盘分区和磁带机)。请避免在路径中使用“\\-程序员宅基地

文章浏览阅读3.3k次。原因:文件名使用了操作系统设备保留字,如com、con、lpt等_filestream 将不会打开 win32 设备(如磁盘分区和磁带机)。请避免在路径中使用“\\

蓝桥杯JAVA-知识点汇总复习-程序员宅基地

文章浏览阅读4.2w次,点赞167次,收藏2.1k次。为准备第十三届蓝桥杯大赛(软件类)省赛。个人博客www.tothefor.com知识点蓝桥杯JAVA-1.入门必知、正常输入输出和快速输入输出蓝桥杯JAVA-2.数组操作蓝桥杯JAVA-3.自定义类排序、进制转换、保留小数位数蓝桥杯JAVA-4.常用数据类型蓝桥杯JAVA-5.位运算技巧和原理蓝桥杯JAVA-6.大数(整数、小数)处理蓝桥杯JAVA-7.集合(容器)在竞赛中的使用..._蓝桥杯java-知识点汇总复习

计算机怎么无线连接网络地址,电脑怎么设置无线网络ip地址-程序员宅基地

文章浏览阅读5k次。有时候我们的电脑连接无线网络不能上网时,可能是因为ip地址获取不到的问题,这个时候可以自己设置无线网络ip地址。下面是学习啦小编整理的电脑设置无线网络ip地址的方法,供您参考。电脑设置无线网络ip地址的方法WIN7电脑点击右小脚网络连接图标,进入网络设置界面,如图2,接着点击无线网络,如果是有线的就点击有线网络。点击底下属性栏目进入下步骤,点击TCP IP 协议则进入设置界面此时大家在这里要注意的..._无线网ip地址怎么设置

mongodb客户端 robo 3T 查询突破50行限制_robo 3t 只能显示50条数据-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏4次。robo 3T的小bug这个mongodb客户端,每次查询数据只有50行,虽然有向下翻页的功能但实际上点击后会被重置,还是只有前50条解决办法DBQuery.shellBatchSize = 500;当前窗口最大查询数量修改到500(只有当前窗口生效)在查询结束语句后加上.toArray()db.getCollection('example').find({}).toArray()..._robo 3t 只能显示50条数据

Android Q Data Disconnection For Default Mobile Data-程序员宅基地

文章浏览阅读166次。直接上流程图和之前的博文类似,可参考Android N Data Disconnection For Long Connection转载请注明出处。_default mobile data

Linux环境下jenkins插件Gerrit Trigger配置--"/var/lib/jenkins/.ssh/id_rsa" does not exist._keys/rsa_2048_pub.key' does not exist-程序员宅基地

文章浏览阅读6.7k次,点赞2次,收藏3次。Gerrit可以实现在线代码Review的功能,与GitLab的merge request功能相当。目前想在Gerrit的基础上增加静态代码扫描的功能,以进一步提升代码质量。网上搜到的技术方案是:Gerrit + Jenkins + Gerrit Trigger。一句话概括就是:在Jenkins上创建一个代码检查的工程,通过pom文件方式配置号第三方的静态代码扫描工具;Jenkins通过Gerri..._keys/rsa_2048_pub.key' does not exist

随便推点

MySQL如何更改数据库名字_mysql update数据库名称-程序员宅基地

文章浏览阅读3.9k次。MySQL如何更改数据库名字_mysql update数据库名称

windows上最好用的文件管理软件 Directory Opus_directory ops-程序员宅基地

文章浏览阅读9w次,点赞24次,收藏65次。windows上最好用的文件管理软件 Directory Opuswindows 自带的文件管理软件就不用提了,垃圾的一比。而市面上比较流行的文件管理软件 xyploer,total commander 之类我都使用过,其中 total commander 的确是神器,但是界面太难看,还有学习路径比较陡峭,最后还是放弃了。后来我使用了 windows 上的资源管理器增强软件 clover 感觉..._directory ops

AWT图形界面设计编程——1.AWT容器_awt容器定义-程序员宅基地

文章浏览阅读212次。1.1AWT容器1.1.1Window和FrameWindow独立存在不依赖于任何其他容器。Window有两个子类:Frame和Dialog。一、窗体Frame:带有标题,而且可以调整大小。1.Frame的构造方法: 1). Frame() 构造的新实例 Frame初始时不可见。 2). Frame(GraphicsConfiguration gc) 构造一个新的,最初看不见的 F..._awt容器定义

一文看懂mybatis底层运行原理解析-程序员宅基地

文章浏览阅读656次,点赞24次,收藏12次。包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

Spring Cloud Alibaba 介绍_sprngcloud alba-程序员宅基地

文章浏览阅读175次。Spring Cloud Alibaba 介绍Sping体系Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。Spring Boot 以 Application(应用) 为中心,提供自动配置、监控等功能。Spring Cloud 以 Service(服务) 为中心,提供服务的注册与发现、服务的调用与负载均衡等功能。Sping Cloud介绍官方介绍​ Tools for building common patterns in distributed systems_sprngcloud alba

测试 数据类型的一些测试点和经验_基础字段的测试点-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏21次。我这里是根据之前在测试数据类项目过程中的一些总结经验和掉过个坑,记录一下,可以给其他人做个参考,没什么高深的东西,但是如果不注意这些细节点,后期也许会陷入无尽的扯皮当中。1 需求实现的准确度根据产品需求文档描述发现不明确不详细的或者存在歧义的地方一定要确认,例如数据表中的一些字段,与开发和产品确认一遍,如有第三方相关的,要和第三方确认,数据类项目需要的是细心,哪怕数据库中的一个字段如果没有提前对清楚,后期再重新补充,会投入更大的精力。2 数据的合理性根据业务场景/常识推理,提..._基础字段的测试点