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

技术标签: 面试  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

智能推荐

Kubernetes为什么叫K8S,K8S的优势到底是什么让它成为当前热门?_kubernetes的优势有哪些-程序员宅基地

文章浏览阅读3.5k次。Kubernetes简介、优势、架构优势、用途、核心概念、术语、快速部署_kubernetes的优势有哪些

DO-178B及DO-178C中的MC/DC有什么不同?-程序员宅基地

文章浏览阅读705次。本文简要讨论了DO-178B及DO-178C中MC/DC的定义。简而言之,DO-178B仅允许唯一原因MC/DC,DO-178C扩展了屏蔽MC/DC及短路MC/DC,大大增强了对存在耦合条件情况的适用性。_do-178c

【PTA】【浙大版《Python 程序设计》7-4 特殊a串数列求和 (20 分)_pta7-4求累加和-程序员宅基地

文章浏览阅读1.1k次。给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。输入格式:输入在一行中给出不超过9的正整数a和n。输出格式:在一行中按照“s = 对应的和”的格式输出。输入样例:2 3输出样例:s = 246思路:列表解析式构建列表,再求和a,n=list(map(int, input().split())) s = sum([int(s..._pta7-4求累加和

AttributeError: module ‘torch.distributed‘ has no attribute ‘deprecated‘的问题解决_module 'torch.distributed' has no attribute 'reduc-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏2次。Traceback (most recent call last): File "<stdin>", line 1, in <module> File "D:\metya\Anaconda3\lib\site-packages\apex\__init__.py", line 4, in <module> from . import parallel File "D:\metya\Anaconda3\lib\site-packages\apex\par._module 'torch.distributed' has no attribute 'reduceop

oracle之索引优化_oracle索引的使用和优化-程序员宅基地

文章浏览阅读2.4k次。oracle中单列索引和复合索引的选择以及导致索引失效一些常见情况(包含对最佳左前缀和全表扫描的描述)_oracle索引的使用和优化

15.脚本备份、恢复达梦DM数据库_docker 达梦数据库 备份恢复-程序员宅基地

文章浏览阅读458次,点赞8次,收藏11次。脚本命令恢复、备份达梦DM数据库_docker 达梦数据库 备份恢复

随便推点

请问想考软考,零基础的话,哪个证书最好考呢_软考哪个容易通过-程序员宅基地

文章浏览阅读4k次。网络工程师、多媒体应用设计师、嵌入式系统设计师、计算机辅助设计师、电子商务设计师、信息系统监理师、数据库系统工程师、系统集成项目管理工程师、信息系统管理工程师、信息安全工程师、计算机硬件工程师、信息技术支持工程师、软件评测师、软件设计师、软件过程能力评估师。记住十大知识领域的各个过程输入输出,另一个重要原因就是,不管考试考哪一个过程,你只要记住了那个过程的流程,在读案例的时候就根据标准的流程去检查,这样能准确的知道案例的问题在哪里。(1)熟悉信息化知识和信息化技术,了解我国信息化建设的有关政策和发展规划;_软考哪个容易通过

Android Studio运行遇到 Error while Launching activity问题_androidstudio运行一直显示在lanching app-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏2次。当我们写完应用程序,先测试一下,其他的什么都没有做的时候,发现怎么都运行不了,而且还出现 Error while Launching activity这个错误,其实这个错误非常好解决,只需要在build中选择clean就可以。是不是很神奇呢!本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!_androidstudio运行一直显示在lanching app

华为nova7se乐活版支持鸿蒙,华为nova7se乐活版和nova8se的详细对比参数对比-程序员宅基地

文章浏览阅读1.3k次。原标题:华为nova7se乐活版和nova8se的详细对比参数对比华为nova7se乐活版和nova8se作为性价比还不错的中端机型,不少小伙伴们不知道该如何选择?那么华为nova7se乐活版和nova8se相比哪款更值得大家入手?小编为大家带来关于华为nova7se乐活版和nova8se的详细对比,欢迎查看。1、主要参数对比参数配置华为nova7SE乐活版华为nova8SE屏幕尺寸6.5英寸6...._华为nova7se可以正常使用华为钱包

Android 录音功能直接拿去用-程序员宅基地

文章浏览阅读95次。前言最近项目中需要用到录音的功能,借鉴了外国一位哥们的项目github.com/dkim0419/So…,搞定需求之后,花了些时间封装成一个录音的工具包,分享给大家,需要源码的 点击这里先贴个效果图给大家看一下,看看这个录音包的功能一、实现录音的 Service这个类可以说是这个包的核心了,如果理解了这个 Service,录音这一块基本就没什么问题了。录音主要是利用 MediaRecod..._mrecorder.setaudioencodingbitrate

【毕业设计/课程设计】基于SSM的二手交易商城的设计与实现(源码+文章) Java | JSP | MVC | Web_二手商城毕设-程序员宅基地

文章浏览阅读229次。系统采用Java语言开发,数据库使用MySql,后端框架采用SSM系统一共分为3个角色,分别是游客、会员、系统管理员。游客端功能:注册、二手商品信息搜索、二手商品信息浏览、求购信息浏览、评论信息浏览。管理员端功能:登录、二手商品审核、二手商品类型管理、用户管理。_二手商城毕设

一位大牛整理的Python 资源_pqr插件 wow-程序员宅基地

文章浏览阅读470次。原文地址:一位大牛整理的Python 资源 作者:helloworld0820zz:一位大牛整理的Python资源(2009-10-10 13:12:40)标签:杂谈 分类:Python来自http://blog.sina.com.cn/s/blog_5d236e060100ep4y.html~type=v5_one&label=rela_n_pqr插件 wow