死锁共有以下几个考点:死锁的概念、死锁与饥饿的联系与区别、死锁计算、死锁产生的必要条件、死锁的处理策略,下面我们依次来看~
一、死锁的概念
死锁:是指多个进程因竞争资源而造成的一种僵局(互相等待对方手里的资源),使得各个进程都被阻塞,若无外力干涉,这些进程都无法向前推进。
二、死锁与饥饿的联系与区别
饥饿:由于分配策略的不合理导致进程长时间等待,并给进程的推进带来了很大影响;
(一)联系
共同点:都是进程无法顺利向前推进的现象。
(二)区别
主要差别:
①发生饥饿的进程可以只有一个;而死锁是因循环等待对方手里的资源而导致的,因此,如果有死锁现象,那么发生死锁的进程必然大于或等于两个。
②发生饥饿的进程可能处于就绪态(长期得不到 CPU,如 SJF 算法的问题),也可能处于阻塞态(如长期得不到所需的I/O 设备,如上述举例);而发生死锁的进程必定处于阻塞态。
三、死锁产生的必要条件
产生死锁必须同时满足以下4个条件,只要其中任一条件不成立,死锁就不会发生。
1)互斥条件。进程要求对所分配的资源(如打印机)进行排他性使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2)不可剥夺条件。进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
3)请求并保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4)循环等待条件。存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
四、死锁计算
对于计算发生死锁最小进程数类题目,设总资源数为N,每个进程需要资源数为n,则最小进程数k等于:
五、死锁处理策略
预防死锁和避免死锁都属于事先预防策略,预防死锁的限制条件比较严格,实现起来较为简单,但往往导致系统的效率低,资源利用率低;避免死锁的限制条件相对宽松,资源分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂。
(一)死锁预防
预防死锁的发生只需破坏死锁产生的4个必要条件之一即可。
- 破坏互斥条件:使资源可以共享;
- 破坏不可剥夺条件:当一个已经保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。
- 破坏请求保持条件:采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源;或者允许进程只获得运行初期所需的资源后,便可开始运行。进程在运行过程中再逐步释放已分配给自己且已使用完毕的全部资源后,才能请求新的资源。
- 破坏循环等待条件:采用顺序资源分配法。首先给系统中的各类资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(编号相同的资源)一次申请完。也就是说,一个进程只在已经占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能再逆向申请小编号的资源,因此不会产生循环等待的现象。
(二)死锁避免
银行家算法用于避免死锁,其思路为:当一个进程申请使用资源的时候,银行家算法通过先 试探 分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。
例题:
(三)死锁检测与解除
可用资源分配图来检测系统所处的状态是否为死锁状态。用圆圈表示一个进程,用框表示一类资源。由于一种类型的资源可能有多个,因此用框中的一个圆表示一类资源中的一个资源。从进程到资源的有向边称为请求边,表示该进程申请一个单位的该类资源;从资源到进程的边称为分配边,表示该类资源已有一个资源分配给了该进程。
简化资源分配图可检测系统状态S是否为死锁状态。简化方法是逐一检查进程,看哪个的请求可以得到满足。S为死锁的条件是当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理。
解除方法有三:(1)资源剥夺;(2)撤销进程;(3)进程回退
(四)三种方法比较
写在后面
这个专栏主要是我在学习408真题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!
参考资料
[1]王道408教材(2025版)
[2]王道课程资料