什么是僵尸进程与孤儿进程

什么是僵尸进程与孤儿进程当一个进程调用 exit 命令结束自己的生命时 其实它并没有真正的被销毁 内核只是释放了该进程的所有资源 包括打开的文件 占用的内存等 但是留下一个称为僵尸进程的数据结构 这个结构保留了一定的信息 包括进程号 theprocessID 退出状态 运行时间 这些信息直到父进程通过 wait waitpid 来取时才释放

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217751.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:50
下一篇 2026年3月18日 上午8:51


相关推荐

  • eclipse、MyEclipse实现批量改动文件编码

    eclipse、MyEclipse实现批量改动文件编码

    2022年1月25日
    40
  • clover默认引导mac(clover win10引导)

    搞定Clover引导的Win&Mac双系统系统迁移至SSD作者:毛毛卷日期:2018-07-20字体大小:小中大从发完贴到现在总算搞定了,具体操作记录如下:由于当年折腾双系统的时候就经历了很多波折而且一般是默认启动MAC而我却是WIN10所以本身的要求和实现方法就有点特殊因此最终并没有偷懒用分区克隆的方法还是按部就班的进行首先把自己提的几个问题回答一下吧首先大概试了A…

    2022年4月11日
    41
  • JavaScript之正则表达式的使用方法详细介绍[通俗易懂]

    JavaScript之正则表达式的使用方法详细介绍[通俗易懂]首先必须说明的是,这类文章(js正则表达式)在c站或者整个it类论坛是很多人写过的,而我认为我这篇的不同之处在于更加“小白”化,这也与我一贯的风格有关吧。关于JavaScript正则表达式,其他的文章大多一上来就太过激进,不利于初学者学习(我当粗就是这么被劝退的),这也是我为什么要坚持写这篇文章,希望小白在看了这篇文章后,不管能不能完全掌握JavaScript正则表达式,但至少对JavaScript正则表达式能有一个比较深刻的印象吧。

    2025年8月5日
    7
  • 【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

    【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」  深度学习一般需要对大量的图片进行标注,但是手动标注耗时耗力,所以模仿labelme软件的功能,使用程序对大批量的图片进行自动标注,大大减少手动操作。下面介绍如何实现对大批量的图片进行标注。自动标注的程序实现:https://github.com/shuyucool/Labelme.git程序内容均为原创,如果使用麻烦您点赞呀如遇疑问,欢迎随时交流,定尽量解答。联系方式:7819…

    2025年10月26日
    7
  • 谈谈唯一约束和唯一索引的关系_唯一约束和主键约束的一个区别是

    谈谈唯一约束和唯一索引的关系_唯一约束和主键约束的一个区别是最近在看数据库相关知识,感觉唯一约束和唯一索引好像有点类似,于是研究了一番,于是就有了这篇文章。概念开始之前,先解释一下约束和索引。约束全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。索引数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种分散的数据结构。可以把索引类比成书的目录,有目录…

    2026年2月3日
    7
  • ping命令和tracert命令的作用_ping命令有哪些

    ping命令和tracert命令的作用_ping命令有哪些本文只是总结了两个常用的网络命令的实现原理和一点使用经验说明。这些东西通常都分布在各种书籍或者文章中的,我勤快那么一点点,总结一下,再加上我的一点理解和使用经验,方便大家了解。这些也是很基础的东西,没什么高深的。Ping这个应该大家都会用的吧,最主要的就是检测目标主机是不是可连通。Ping程序实际就是发送一个ICMP回显请求报文(就是请求别人收到这个报文之后回显)给目的主机,并等待回显的ICM…

    2026年3月5日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号