682 字
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

死锁是多个进程或线程因争用资源而互相等待,形成无法自行推进的循环。经典 Coffman 模型指出,以下四个必要条件必须同时成立;只要系统规则能破坏其中一个,便可预防该类死锁:

  1. 互斥:某类资源一次只能由一个执行者使用,例如互斥锁。对打印机等独占资源,通常无法消除互斥本身。
  2. 占有并等待:执行者持有至少一个资源,又请求其他资源。可要求一次性申请所需资源,或者申请新资源前先释放已有资源;代价是资源利用率下降、可能饥饿,也不适合资源需求动态变化的场景。
  3. 不可剥夺:资源不能被强制夺走,只能由持有者主动释放。若资源状态可安全保存和恢复,可以在等待时抢占或回滚;但锁、打印任务等资源往往不能随便强制拿走。
  4. 循环等待:存在环形资源等待关系。常见工程办法是给锁建立全局序号,所有线程按同一顺序获取多把锁,释放时再按需要处理,从而不形成等待环。

预防是通过制度破坏必要条件;它不同于避免。避免算法会在每次资源请求时检查分配后是否仍处于安全状态;检测与恢复则容许死锁发生,事后寻找循环并打破。回答时不要把“避免资源互斥”当成普遍方案,互斥往往正是资源语义要求。

常见追问#

Q:四个条件是否单独任何一个就会造成死锁?
A:不是。它们是经典模型中的必要条件,必须同时满足才可能形成死锁;满足四项也表示“可能”死锁,不代表此刻一定已死锁。

Q:固定锁顺序破坏哪个条件?
A:它破坏循环等待。只要所有路径都遵守同一严格顺序,就不能构成从高序号锁再等待低序号锁的环。

Q:为什么不把所有资源都一次性申请?
A:这能破坏占有并等待,但资源需求可能未知或动态变化;一次申请会长期占住闲置资源,也可能让任务饥饿,因此通常不是通用做法。

Q:死锁和饥饿有什么区别?
A:死锁是一组执行者构成互相等待的闭环、组内无人前进;饥饿是某个执行者长期抢不到资源,系统其他任务仍可能继续运行。

死锁的四个必要条件是什么?如何逐个预防
https://blog.xqcherry.top/posts/interview/operating-system/deadlock-four-conditions-and-prevention/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0