死锁的概念 ⚠️
1. 死锁的定义
死锁:多个进程因循环等待对方占有的资源而陷入的僵局,若无外力干预,进程将永远无法推进。
核心特征:
- 相互等待:每个进程都在等待其他进程释放资源。
- 不可推进:无外力时,所有进程均阻塞。
生活实例:两座桥两端的汽车互不相让,都占用部分桥面并等待对方后退。
计算机实例:进程P1占用输入设备并请求打印机,进程P2占用打印机并请求输入设备,二者循环等待。
2. 死锁与饥饿的区别
对比项 | 死锁 | 饥饿 |
进程数量 | 至少2个进程(循环等待)。 | 可仅1个进程(长期得不到资源)。 |
进程状态 | 均处于阻塞态(等待资源)。 | 可处于就绪态(如CPU饥饿)或阻塞态(如I/O饥饿)。 |
本质原因 | 循环等待资源(4个必要条件同时满足)。 | 资源分配策略不公平(如优先级低、短作业优先导致长作业长期等待)。 |
是否可恢复 | 需外力干预(如杀死进程、剥夺资源)。 | 可能自动恢复(如高优先级进程完成,低优先级进程获得资源)。 |
3. 死锁产生的原因
(1)资源竞争
- 不可剥夺资源(如打印机、磁带机):数量有限,多个进程争夺时易导致死锁。
- 可剥夺资源(如CPU、内存):不会导致死锁(可强行剥夺)。
(2)进程推进顺序非法
- 请求/释放资源的顺序不当(如循环请求对方已占资源)。
- 信号量使用错误(如进程相互等待对方发送消息)。
4. 死锁产生的4个必要条件(缺一不可)
- 互斥条件:资源只能被一个进程独占(如打印机)。
- 不可剥夺条件:资源一旦分配,只能主动释放(不可强行夺走)。
- 请求并保持条件:进程占有部分资源,又请求新资源而阻塞,且不释放已占资源。
- 循环等待条件:存在进程-资源循环等待链(如P1等待P2的资源,P2等待P1的资源)。
关键:破坏任一条件即可预防死锁。
5. 死锁的处理策略
策略 | 核心思想 | 优点 | 缺点 |
死锁预防 | 破坏4个必要条件之一(如资源预分配、可剥夺资源)。 | 实现简单,系统不会发生死锁。 | 资源利用率低,限制进程灵活性(如预分配导致资源浪费)。 |
死锁避免 | 动态检查资源分配安全性,避免进入“不安全状态”(如银行家算法)。 | 资源利用率较高,允许动态分配。 | 实现复杂(需实时计算安全性),仅适用于可预测资源需求的场景。 |
死锁检测与解除 | 允许死锁发生,通过检测算法发现死锁,再通过撤销进程或剥夺资源解除。 | 资源利用率最高,限制最少。 | 检测和解除死锁需额外开销,可能导致部分进程被强行终止。 |
核心考点 📌
- 死锁的4个必要条件:互斥、不可剥夺、请求并保持、循环等待(需能举例区分)。
- 死锁与饥饿的差异:死锁是循环等待(多进程阻塞),饥饿是长期等待(单进程可能就绪)。
- 死锁处理策略的对比:预防(破坏条件)、避免(安全检查)、检测解除(允许发生后处理)。
总结
死锁是指多个进程因循环等待资源而陷入僵局,其四大必要条件为互斥、不可剥夺、请求并保持、循环等待。与饥饿不同,死锁涉及多进程相互阻塞,而饥饿是单进程长期得不到资源。死锁处理策略包括预防(破坏条件)、避免(银行家算法)及检测解除(事后恢复),需权衡资源利用率与系统开销。核心在于理解死锁的本质及应对方法的适用场景。
✨ 一句话记忆:死锁是“循环等待资源”的僵局,需4个条件同时满足;处理策略从“预防(破坏条件)”“避免(安全分配)”到“检测解除(事后处理)”,平衡资源利用率与系统复杂度! ✨