孤儿进程和僵尸进程区别

僵尸进程

僵尸进程是已经终止(执行完毕或被杀死)但其父进程尚未收集wait()waitpid() 系统调用)其退出状态的进程

  • 产生原因:当一个子进程终止时,它会向操作系统发送一个信号,表示自己已完成任务。操作系统会释放该进程几乎所有的资源,包括内存和文件描述符。然而,它的进程描述符(PCB,Process Control Block)仍然保留在内存中,以便父进程能够读取它的退出状态(例如,是否成功执行、退出码是多少)。如果父进程没有及时调用 wait()waitpid() 来获取这些信息并释放子进程的 PCB,子进程就会一直处于“僵尸”状态
  • 特点
    • 不占用内存空间
    • 会占用一个 PID,因为 PCB 还没有被回收
    • 由于 PID 是有限的,大量的僵尸进程可能会导致系统没有可用的 PID,从而无法创建新的进程
  • 如何识别:在 pstop 命令的输出中,僵尸进程的状态通常显示为 <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。
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:03

results matching ""

    No results matching ""