孤儿进程与僵尸进程产生原因及危害

参考博客:https://www.cnblogs.com/Anker/p/3271773.html

父进程创建的进程为该父进程的子进程

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

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

孤儿进程和僵尸进程产生的原因:
归根结底还是Unix操作系统提供了一种这样的机制:让父进程可以知道子进程结束时的状态信息。
如果没有这种机制,一个子进程结束,就把他的所有资源和信息全部释放掉,那父进程就无法获得子进程结束时的状态信息了,对吧?所以子进程结束的时候会留下一个数据结构,用这个数据结构存储子进程结束时的信息,直到父进程调用wait或者waitpid的时候才释放。

那就有下面的情况发生:
一、如果父进程一直比较忙,或者因为其他原因没有去wait/waitpid子进程结束时候留下的状态信息,那这些已经结束的线程遗留的数据结构就无从清理,也就产生了所谓的僵尸进程,因为数据结构里包含pid等信息,操作系统的pid是有限的,因此僵尸进程是有害的。
二、如果父进程先于子进程结束,那子进程无父进程了,如果之后子进程也结束,谁去释放他遗留下来的数据结构呢?这个无父进程的子进程就叫孤儿进程,他将会被init进程(pid=1)托管,之后此子进程结束的话,他的遗留数据结构将会被init进程去wait/waitpid释放(这里我产生了一个疑问,希望可以和大家讨论一下,我们unix设计这种机制的初衷是为了让父进程可以知道子进程结束时的状态信息对吧,那父进程都挂掉了,子进程其实也无需遗留状态信息了,那操作系统是否可以这样设置:将孤儿进程交给init进程托管 改为:孤儿进程结束时,直接释放所有信息,包括其遗留数据结构)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值