### 孤儿进程和僵尸进程区别 **僵尸进程** **僵尸进程**是已经**终止**(执行完毕或被杀死)但其父进程尚未**收集**(`wait()` 或 `waitpid()` 系统调用)其退出状态的进程 - **产生原因**:当一个子进程终止时,它会向操作系统发送一个信号,表示自己已完成任务。操作系统会释放该进程几乎所有的资源,包括内存和文件描述符。然而,它的进程描述符(PCB,Process Control Block)仍然保留在内存中,以便父进程能够读取它的退出状态(例如,是否成功执行、退出码是多少)。如果父进程没有及时调用 `wait()` 或 `waitpid()` 来获取这些信息并释放子进程的 PCB,子进程就会一直处于“僵尸”状态 - **特点**: - 它**不占用**内存空间 - 它**会占用**一个 PID,因为 PCB 还没有被回收 - 由于 PID 是有限的,大量的僵尸进程可能会导致系统没有可用的 PID,从而无法创建新的进程 - **如何识别**:在 `ps` 或 `top` 命令的输出中,僵尸进程的状态通常显示为 `` 或 `Z` - **处理方法**:唯一能清理僵尸进程的方法是**杀死它的父进程**。当父进程被杀死后,这个僵尸进程就会变成一个孤儿进程,并被 `init` 进程(PID 1)收养,`init` 进程会负责清理它。 **孤儿进程** **孤儿进程**是指**正在运行**但其父进程已经**终止**的进程 - **产生原因**:当父进程在子进程之前退出,子进程就成了“孤儿” - **特点**: - 它**仍然在运行**,只是失去了它的原始父进程 - 它**不会**成为系统的负担,因为它会自动被操作系统中最特殊的进程——`init` 进程(PID 1)收养 - **如何识别**:在 `ps` 命令的输出中,你可以看到它的父进程 ID(PPID)变成了 `1` - **处理方法**:孤儿进程会被 `init` 进程**收养**。`init` 进程会像对待自己的子进程一样,在它最终终止时调用 `wait()` 来收集其退出状态,从而防止它变成一个僵尸进程 | 特性 | 僵尸进程(Zombie Process) | 孤儿进程(Orphan Process) | | -------- | --------------------------------------- | ------------------------------------------ | | 状态 | 已终止,但其进程描述符未被父进程回收。 | 正在运行,但其父进程已终止。 | | 产生原因 | 父进程没有调用 wait() 或 waitpid()。 | 父进程在子进程之前退出。 | | 系统影响 | 占用 PID,大量存在会导致 PID 资源耗尽。 | 通常无害,会被 init 进程收养。 | | 处理方式 | 杀死其父进程。 | 由 init 进程自动收养并管理,无需人工干预。 | | ps 状态 | Z 或 `` | 运行中,但其 PPID(父进程 ID)为 1。 |