**进程饥饿(starvation)**指某个进程/线程长期得不到所需资源(主要是 CPU 时间),一直处于就绪状态却无法运行。它不是死锁——系统整体仍在正常推进,只是个别进程被"饿死"。
展开解析:常见成因是调度策略不公平:
- 纯优先级调度:高优先级进程源源不断到来时,低优先级进程永远轮不上。
- 短作业优先(SJF):长作业可能被不断到来的短作业无限推迟。
- 并发原语不公平:某些锁/信号量实现不保证等待顺序,运气差的线程反复抢不到。
避免手段:
- 老化(aging):最经典的解法——随等待时间增长动态提高进程优先级,等得越久优先级越高,最终必然获得 CPU。
- 公平调度:采用时间片轮转、多级反馈队列、Linux CFS(完全公平调度器,按虚拟运行时间选最"亏欠"的进程)等兼顾公平的算法。
- 公平锁:如 Java 中 ReentrantLock 的公平模式,按等待顺序唤醒。
易错点:饥饿与死锁的区别——死锁是所有相关进程都卡住且系统不再进展;饥饿中其他进程活得好好的,只有个别进程受害,且理论上存在"突然走运"恢复的可能。
追问方向:多级反馈队列如何兼顾短作业响应与长作业不被饿死、读者-写者问题中的写者饥饿。