僵尸进程与孤儿进程解析

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

我们都知道Linux中的进程可以分有多种状态:

R(runing):运行状态

S(sleeping):浅度睡眠状态

D(disk sleep):磁盘睡眠状态

T(stopped):停止进程

X(dead):死亡状态

Z(zombie):僵尸状态


僵尸状态

(1)僵尸状态是一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码

运行结果:


 我们知道僵尸进程的产生是因为进程退出时父进程并没有等待子进程,也就是说,父进程和子进程是不同步的。
那么问题来了,父进程是不会预测到子进程退出的,也就不会第一时间去处理,所以,Linux为了防止子进程丢失退出时的状态信息,而产生了僵尸进程。也就是说,子进程虽然退出释放资源,然而仍有一部分资源等着父进程来释放,父进程来释放之前一直都是占用着内存的,那么,如果有很多的僵尸进程呢?那还不卡死。

子进程进程号会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。

那么如何避免这个问题呢?
⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
⒊ 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
⒋ 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收 还要自己做。


孤儿进程

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

运行结果:


     任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。  如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对子进程进行处理。
      这样来看,孤儿进程并不会有什么危害,真正会对系统构成威胁的是僵死进程。例如有这样一个父进程:它定期的产生一个子进程,这个子进程做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是,父进程只管生成新的子进程,至于子进程退出之后的事情,则一概不闻不问,这样,系统运行上一段时间后,系统中就会存在很多的僵死进程,倘若用ps命令查看的话,就会看到很多状态为Z的进程。 严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们需要消灭系统中大量的僵死进程时, 就要把产生大量僵死进程的那个杀掉(也就是通过kill发送SIGTERM或者SIGKILL信号)。枪毙了元凶进程之后,它产生的僵死进程就变成了孤儿进程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源 。

僵尸进程与孤儿进程的区别:
孤儿进程是子进程还在运行,而父进程挂了,子进程被init进程收养。僵尸进程是父进程还在运行但是子进程挂了,但是父进程却没有使用wait来清理子进程的进程信息,导致子进程虽然运行实体已经消失,但是仍然在内核的进程表中占据一条记录,这样长期下去对于系统资源是一个浪费。僵尸进程将会导致资源浪费,而孤儿则不会。

深入理解Linux进程世界:孤儿进程僵尸进程解析 文章摘要:本文深入解析Linux系统中的两种特殊进程状态——孤儿进程僵尸进程孤儿进程产生于父进程先于子进程退出的情况,会被init进程自动收养;僵尸进程则是已终止但未被父进程回收资源的子进程。通过代码实例演示了两种进程的生成过程,并对比分析了它们的特性、资源占用及潜在危害。文章指出,僵尸进程会占用系统资源,可能导致PID耗尽,而孤儿进程因有init回收机制而相对无害。 阅读详情

相关推荐

Linux僵尸进程孤儿进程详解

本文主要给大家介绍了关于Linux僵尸进程孤儿进程的相关内容,分享给出来供大家参考学习,下面来看看详细的介绍: 1、僵尸进程 一个子进程在其父进程没有调用wait()或waitpid()的情况下退出,这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。 运行结果 2、孤儿进程 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程孤儿进程将被init进程进程号为1)所收养,并由init进程对他们完成状态收集工作。 运行结果 然而子进程一直在调用,也不能被ctrl^c掉。。 3、注

孤儿进程僵尸进程的区别

一.产生的原因 一般进程 正常情况下:子进程由父进程创建,子进程再创建新的进程。父子进程是一个异步过程,父进程永远无法预测子进程的结束,所以,当子进程结束后,它的父进程会调用wait()或waitpid()取得子进程的终止状态,回收掉子进程的资源。 2)孤儿进程 孤儿进程:父进程结束了,而它的一个或多个子进程还在运行,那么这些子进程就成为孤儿进程(father died)。子进程的资源由ini...

a13568hki的博客 1万+

ArduPilot飞控系统代码解读及架构分析

ArduPilot飞控系统是一个复杂而强大的系统,通过模块化设计和分层架构,实现了灵活的飞行控制功能。模块化设计: 各个功能模块相对独立,便于维护和扩展多种飞行模式: 满足不同的飞行需求强大的控制算法: 实现稳定的姿态和位置控制完善的安全机制: 保障飞行安全丰富的配置选项: 通过参数系统实现高度可定制性这种架构使ArduPilot能够适应从简单的多旋翼到复杂的自主飞行器等各种应用场景。类结构分析:Mode基类 (mode.h/mode.cpp)

fengforky的专栏 2983

什么是僵尸进程孤儿进程

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

张维鹏的博客 3万+

僵尸进程孤儿进程的区别

1. 僵尸进程:一个子进程在父进程还没有调用wait()方法或者waitpid()方法的情况下退出,这个子进程就是僵尸进程; 2. 孤儿进程:一个父进程退出,它的一个或多个子进程还在运行,子进程将成为孤儿进程孤儿进程将被init进程所收养; 3. 僵尸进程将会导致资源浪费,而孤儿进程则不会。

Holmes_Conan的专栏 9570

【操作系统】【进程管理】孤儿进程僵尸进程

当一个子进程结束时,它会向父进程发送SIGCHLD信号,父进程可以通过wait()或waitpid()函数来回收子进程状态信息,从而消除僵尸进程。程序设计问题:如果程序设计存在问题,如没有及时回收子进程状态信息,就可能导致产生大量的僵尸进程,从而导致init进程无法回收所有的僵尸进程僵尸进程不会占用CPU资源,但会占用系统的进程表项,如果大量的僵尸进程积累,就会导致系统进程表满,从而影响系统的正常运行。如果僵尸进程的父进程在短时间内退出了,那么僵尸进程的父进程ID会被设置为1,即init进程

Michael 1493

解析僵尸进程孤儿进程

一、僵尸进程孤儿进程的定义我们知道一个子进程如果要结束,其内核释放进程的所有资源,但是还保存了一部分资源供父进程使用(是一个被称之为僵尸进程的数据结构,包含有进程号、运行时间、退出状态等,它需要父进程去处理),所以其父进程要调用wait或者waitpid获取子进程状态信息,然而如果父进程没有调用这个信息会发生什么情况呢? 如果父进程没有调用这个信息,那么这段信息将会被一直占用,但是系统中的资源是

ArchyLi 1306

解析僵尸进程孤儿进程

大家都知道Linux中的进程分为多种状态,例如: “R (running)”运行状态、 “S (sleeping)”睡眠状态(浅度睡眠)、 “D (disk sleep)”磁盘睡眠状态、 “T (stopped)”停止进程、 “X (dead)”死亡状态、 “Z (zombie)”僵死状态等等。 僵死状态是一个比较特殊的状态:当进程退出并且父进程(使用wait()系统调用)没有读取到...

Amber的博客 566

Linux复习:进程状态环境变量深度解析孤儿僵尸进程程序启动探究

摘要 本文深入解析Linux进程状态环境变量。首先将进程状态分为运行态、可中断睡眠态、不可中断睡眠态、暂停态和僵尸态,详细说明各状态特征及转换条件。重点分析两种特殊进程僵尸进程(子进程终止未回收)和孤儿进程(父进程先终止),指出其危害并提供解决方案。最后探讨程序启动时命令行参数环境变量的传递机制,为理解进程管理和系统编程奠定基础。通过代码示例和实操演示,帮助读者掌握进程状态监控资源回收的关键技术。

Maple_land的博客 824

孤儿进程僵尸进程(超详细解析 + 代码演示)

进程先退出,子进程还在运行,此时子进程就变成了孤儿进程。操作系统会自动将孤儿进程的父进程「过继」给init进程(PID=1),由 init 进程完成后续的资源回收。子进程已经退出,父进程没有调用wait()waitpid()回收子进程的 PCB 资源,此时子进程就变成了僵尸进程孤儿进程:父死子活 → 被 init 收养 → 安全无害。僵尸进程:子死父不回收 → 残留资源 → 有害,必须避免。父进程的核心责任:子进程退出后,必须调用wait()waitpid()回收资源,避免产生僵尸进程

kin26681的博客 223

Linux进程管理:僵尸进程孤儿进程守护进程的深度解析实战

Linux系统编程中,进程管理是核心基础。进程通过fork()系统调用创建,形成父子关系,并采用写时复制(Copy-On-Write)技术优化内存使用。进程终止后,其退出状态需由父进程通过wait()或waitpid()系统调用回收,这是理解进程生命周期和资源管理的关键原理。若父进程未能及时回收已终止子进程的资源,便会形成僵尸进程(Zombie Process),占用系统内核资源(如PID和task_struct结构体),长期积累可能导致系统资源耗尽。反之,若父进程先于子进程终止,子进程则成为孤儿进程(O

weixin_33805992的博客 429

关于fork后孤儿进程僵尸进程的学习总结

本文转载自:http://www.cnblogs.com/Anker/p/3271773.html,https://blog.csdn.net/aitangyong/article/details/39348203,感觉这两个博客对孤儿进程僵尸进程讲解的非常好。 1、基本概念   我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再创建新的子进程。子进程的结束和父...

Hide_on_code的博客 231

孤儿进程僵尸进程产生及其处理

在探讨这个问题之前,我们先来弄清什么是进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数...

Eunice_fan1207的博客 2万+

Linux进程4:孤儿进程僵尸进程(及解决方法),守护进程讲解

孤儿进程僵尸进程(及解决方法),守护进程讲解 孤儿进程: 父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”此时的子进程叫做孤儿进程。====爹没了。 Linux避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。====init养父 僵尸进程: 创建子进程后,子进程退出状态不被收集,变成僵尸进程。爹不要它了 除非爹死后变孤儿init养父接收。如果父进程是死循环,那么该僵尸进程就变成游魂野鬼消耗空间。 守护进程: 守护进程(Daemon)是在一类脱离终端在后台执行的程序

哒宰的博客 1万+

Linux进程概念——父子进程僵尸进程孤儿进程

透彻了解父子进程僵尸进程孤儿进程

Dooo_yh的博客 1万+

僵尸进程

当我刚开始接触接触僵尸进程孤儿进程的时候,我一直搞不清楚二者到底是什么区别。我相信对于很多刚接触进程的学生来说是和我一样的,不理解僵尸进程孤儿进程的概念。现在我就按照我的理解给大家简单的叙述一下,希望对大家能够有所帮助。 我理解的孤儿进程就是父进程死了之后所剩下的子进程。大家想象一下对于孤儿我们通常会怎么样?当然是送进孤儿院了,我们这里的1号进程,也就是大多数系统下的init进程,就相当于这个...

m0_37795270的博客 192

进程状态僵尸进程以及孤儿进程

进程状态僵尸进程以及孤儿进程 进程状态 课本上的进程状态分为三种:就绪,阻塞,运行 进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程进程状态即体现一个进程的生命状态。 运行(running)态:进程占有处理器正在运行。 就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行。 等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。 在Linux下的进程状态分为 运行状态–R:正在运行或者只要拿到时

weixin_43831728的博客 465

孤儿进程僵尸进程、守护进程的概念

   孤儿进程僵尸进程、守护进程的概念 1 基本概念⭐⭐⭐⭐⭐ 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程状态信息,那么子进程进程描述符仍然保存在系统中。这种进程称之为僵死进程。 一个子进程进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程

qq_43604517的博客 1368
上一篇: 菱形虚拟继承详解
下一篇: 进程管理(一)
TerryZjl
博客等级 码龄10年 182粉丝 86原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值