Files
Sec-Interview/Chapter22/22-3.md
T
2025-10-23 00:11:05 +08:00

33 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 孤儿进程和僵尸进程区别
**僵尸进程**
**僵尸进程**是已经**终止**(执行完毕或被杀死)但其父进程尚未**收集**(`wait()``waitpid()` 系统调用)其退出状态的进程
- **产生原因**:当一个子进程终止时,它会向操作系统发送一个信号,表示自己已完成任务。操作系统会释放该进程几乎所有的资源,包括内存和文件描述符。然而,它的进程描述符(PCBProcess Control Block)仍然保留在内存中,以便父进程能够读取它的退出状态(例如,是否成功执行、退出码是多少)。如果父进程没有及时调用 `wait()``waitpid()` 来获取这些信息并释放子进程的 PCB,子进程就会一直处于“僵尸”状态
- **特点**
- 它**不占用**内存空间
- 它**会占用**一个 PID,因为 PCB 还没有被回收
- 由于 PID 是有限的,大量的僵尸进程可能会导致系统没有可用的 PID,从而无法创建新的进程
- **如何识别**:在 `ps``top` 命令的输出中,僵尸进程的状态通常显示为 `<defunct>``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 或 `<defunct>` | 运行中,但其 PPID(父进程 ID)为 1。 |