孤儿进程和僵尸进程

孤儿进程和僵尸进程是Linux多进程环境中的特殊状态。孤儿进程是因父进程退出,子进程被init进程收养;僵尸进程则是父进程未回收已退出子进程的状态,占据进程表项。过度的僵尸进程可能导致系统无法分配新的pid。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       孤儿进程和僵尸进程与Linux的进程回收机制有关。在Linux中,使用系统调用exit函数族使进程结束运行。在用户程序中即使程序员没有写入调用exit的代码,系统也会在最后执行exit的系统调用。

       在多进程环境下,子进程的结束状态应该让父进程知道,因为父进程可能会需要子进程的一些信息。程序都会有返回值,子进程的主函数会把返回值通过系统调用exit提交给内核(因此exit调用必须被提供返回值参数status)。但进程间的地址空间独立,即使是父子进程,它们之间也是相互独立不可互访的,进程间通信必须要经由内核(无论是管道、消息队列、共享内存还是socket)。子进程的返回值需要先交给内核,再由父进程向内核请求访问其返回值。

       进程是独立的调度单元,每个进程都有自己的返回值,在Linux的实现中,其返回值会被内核写入调用exit的进程的PCB中。进程在调用exit时就标识进程的生命周期结束了,其占用的大部分资源会被内核回收,比如内存、页表等,但进程的PCB还不能被回收,因为这里面存放着进程的结束状态。父进程通过调用waitwaitpid来获取子进程的结束状态,然后内核才能回收子进程的PCB。也就是说,回收PCB的工作不是在子进程调用exit时,而是在父进程调用wait或waitpid后,内核受理系统调用期间。

       有一种情况是,当父进程提前退出时,它所有还未结束运行的子进程就成为了孤儿进程。这时候所有的子进程都会被init进程“收养”,init进程会成为这些孤儿进程的新父亲。

       如果父进程没有调用或未成功调用wait或waitpid来回收已经exit的子进程,它们的PCB就不会被释放,这些已经结束生命周期但PCB还未被回收的进程就称为僵尸进程。僵尸进程就是针对子进程的返回值是否成功提交给父进程而提出的,父进程不调用wait或waitpid,内核就无法回收子进程PCB,因此就会占据一个进程表项。如果僵尸进程的数量过多,系统将没有可用的pid分配给新进程,从而导致加载进程失败。此时需要将僵尸进程的父进程杀死,在Linux中可以利用ps -ef查看所有任务的pid和ppid,找到状态为Z的进程,查看其ppid,然后对父进程执行kill -9即可。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值