573 字
3 分钟
什么是僵尸进程和孤儿进程?如何处理
  1. 1操作系统面试学习路线与知识地图
  2. 2什么是用户态和内核态
  3. 3什么是系统调用?它和普通函数调用有什么区别
  4. 4进程和线程有什么区别
  5. 5进程的五种状态:新建、就绪、运行、阻塞与终止
  6. 6fork、exec 和 wait 分别做什么
  7. 7什么是竞态条件和临界区?如何保证互斥
  8. 8互斥锁和自旋锁有什么区别?分别适合什么场景
  9. 9死锁的四个必要条件是什么?如何逐个预防
  10. 10缺页异常如何处理?虚拟内存不等于 Swap
  11. 11阻塞、非阻塞、同步、异步 I/O 怎么区分
  12. 12抢占式调度是什么?SJF 和 MLFQ 适合什么假设
  13. 13进程间通信如何选择?管道、共享内存、信号和 Socket
  14. 14线程切换时,操作系统要做哪些操作
  15. 15进程上下文切换要保存什么?为什么有开销
  16. 16死锁是什么?如何预防和避免死锁?
  17. 17银行家算法如何避免死锁?死锁检测后怎样恢复
  18. 18活锁、饥饿和死锁有什么区别
  19. 19进程调度算法:FCFS、SJF、优先级、时间片轮转与多级反馈队列
  20. 20调度指标有哪些?什么是优先级反转
  21. 21为什么要有虚拟内存
  22. 22TLB、多级页表和虚拟地址转换是怎么工作的
  23. 23什么是分段,什么是分页
  24. 24页面置换算法有哪些?FIFO、LRU 和 Clock
  25. 25信号量是什么?计数信号量和二元信号量怎么用
  26. 26条件变量是什么?为什么要和互斥锁配合使用
  27. 27进程间通信方式:管道、消息队列、共享内存、信号量与套接字
  28. 28I/O 模型有哪些:阻塞、非阻塞与多路复用
  29. 29select、poll 和 epoll 有什么区别
  30. 30epoll 的 LT 和 ET 模式有什么区别
  31. 31什么是异步 I/O?它和非阻塞、多路复用的区别
  32. 32什么是僵尸进程和孤儿进程?如何处理本文
  33. 33原子操作是什么?原子性、可见性和有序性有什么区别
  34. 34什么是工作集和抖动?内存不足时为何系统变慢
  35. 35mmap 是什么?文件映射和匿名映射怎么理解
  36. 36什么是写时复制?fork 和私有映射如何利用 COW

僵尸进程是已经执行结束、资源大多已释放,但退出状态尚未被父进程 wait 获取的子进程记录。内核暂时保留 PID、退出码和少量统计信息,便于父进程查询。它不再执行用户代码,也不是仍占用完整地址空间的“死进程”;但大量未回收的僵尸会占用 PID 和进程表项。

父进程可通过 wait() 或 waitpid() 回收已退出子进程。服务程序若会创建许多子进程,应在合适位置等待,或处理 SIGCHLD 并循环调用非阻塞 wait,因为一次信号通知可能对应多个已退出子进程。仅设置忽略 SIGCHLD 或特定自动回收选项属于平台相关做法,应理解其语义再采用。

孤儿进程是父进程先于子进程退出的仍在运行的进程。它会被系统中的子收割进程重新收养(Linux 上通常是 init 或配置的 subreaper),之后退出时由新父进程负责回收。孤儿不等于僵尸:孤儿仍可能正常运行;僵尸已经退出,只是等待回收。

排查时可查看进程状态并检查父 PID。僵尸通常表现为已退出等待回收的状态,向它发送普通终止信号无效,因为它已不再运行;应找到并修复未 wait 的父进程。孤儿则需判断服务管理器或容器的 PID 1 是否正确接收并回收子进程。

常见追问#

Q:僵尸进程能用 kill 杀掉吗?
A:不能按普通运行进程的方式终止,它已经退出。需要让父进程调用 wait 回收;若父进程失效,父进程退出后由新父进程接管回收。

Q:孤儿进程一定有问题吗?
A:不一定。父进程退出后子进程可继续运行并被系统收养,这是允许的生命周期状态;关键在于其资源和退出状态最终有人管理。

Q:wait 和 waitpid 有什么常见差别?
A:wait 等待任意一个子进程;waitpid 可指定子进程或进程组,并可使用选项实现非阻塞检查等行为。

什么是僵尸进程和孤儿进程?如何处理
https://blog.xqcherry.top/posts/interview/operating-system/zombie-orphan-process/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0