僵尸进程和孤儿进程

Posted by KalosAner on March 25, 2025

一、引言

进程一般都是由父进程创建和回收,如果一个进程创建之后不进行回收就会一直占用资源,包括 PCB。

二、孤儿进程

一个进程还在执行,而他的父进程已经退出了,那么这个进程就会成为孤儿进程。孤儿进程会由 init 进程收养,之后当孤儿进程结束时也有 init 进程回收。

孤儿进程会拖累 init 进程,但是对系统的危害不大。

三、僵尸进程

一个进程执行完毕之后,它的父进程没有退出但是也没有对该进程进行回收,这个进程就会成为僵尸进程,占用系统资源。

僵尸进程的回收主要有 4 种方法:

1、主动调用 wait,waitpid

2、终止父进程:kill -9 pid;让僵尸进程被 init 进程回收

3、信号处理:父进程注册 SIGCHILD 信号处理函数,在回调中调用 wait 和 waitpid

4、双 fork:当需要一个进程时,先创建进程 A ,然后由进程 A 创建需要的进程 B 之后进程 A 退出,由 init 收养进程 B。

四、案例

redis 采用 rdb 持久化时会使用 fork 创建一个新的进程保存快照。当持久化结束后,子进程退出,之后 redis 就要对子进程进行回收。

redis 采用的是 计时器+waitpid 的方法来完成对子进程的回收的。