孤儿进程和僵尸进程区别
僵尸进程
僵尸进程是已经终止(执行完毕或被杀死)但其父进程尚未收集(wait()
或 waitpid()
系统调用)其退出状态的进程
- 产生原因:当一个子进程终止时,它会向操作系统发送一个信号,表示自己已完成任务。操作系统会释放该进程几乎所有的资源,包括内存和文件描述符。然而,它的进程描述符(PCB,Process 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 或 |
运行中,但其 PPID(父进程 ID)为 1。 |