本文已收录到:清华大学操作系统课程笔记 专题
死锁
资源类型:
资源分类
分为两类资源:可重用资源和消耗资源(一次性)
可重用资源举例:
消耗资源举例:
资源分配图
描述资源和进程之间的分配和占用的关系:资源分配图
此种简单的情况可以从资源分配图中看到。但实际上的操作系统不能这么看
仅仅依靠循环来看死锁不能行。
死锁处理方法
由进程处理死锁,操作系统不管这事。
死锁预防:限制申请方式
以下情况会出现死锁:
1)互斥
即早期打印机同时把两个打印作业发送给打印机,那么打出来的东西谁都没法用。现在打印机内部通常有缓冲池,由打印机内部调度众多的打印作业。互斥的进程天生的特性,不好避免。
2)请求并保持
即你要申请资源,就一次性全部申请完,别一会儿要,一会儿又要的。比如贷款的时候,一次把所有需要的钱贷出来。进程开始的时候申请所有必要的资源,否则不开始。不过这样子,效率很比较低。
3)不剥夺
资源只能自己放弃,不能剥夺。例如两个车窄桥相遇,都同时倒车,再尝试申请。
4)循环等待
预防死锁只需要破坏死锁的四个必要条件之一即可:
- 破坏互斥条件:任何时候只能有一个进程使用一个资源(进程天生的,不好破坏)
- 破坏不可剥夺条件: 当进程的新资源不可取得时,释放自己已有的资源,待以后需要时重新申请。 但这种方法可能导致迁移阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。(剥夺你)
- 破坏请求并保持条件:进程在运行前一次申请完它所需要的全部资源,在它的资源为满足前,不把它投入运行。一旦投入运行,这些资源都归它所有,不能被剥夺。但这种方法系统资源被严重浪费,而且可能导致饥饿现象,由于个别进程长时间占用某个资源,导致等待该资源的进程迟迟无法运行。(全给你)
- 破坏循环等待条件: 给资源编号,规定每个进程必须按编号递增地顺序请求资源,同类资源一次性申请完。这种方法存在问题是发生作业使用资源地顺序与系统规定的顺序不同,造成系统地浪费,并且给编程带来麻烦。(编号)
这四种方法都有各自的缺陷,我们一般不采用。
死锁避免
分配资源的时候,就去先验证下会不会出现死锁。只有不会出现死锁才给分配资源。
银行家算法
银行家算法是一种避免死锁产生的办法。是由银行借贷分配作为基础的,判断并保证系统处于安全状态。
注意:银行家算法不是预防死锁产生办法。预防指的是预先防备,有备无患,避免是设法不使某种情形发生。
银行家算法基本思想
银行家算法的数据结构
银行家算法安全状态判断
参考考研操作系统真题——银行家算法、判断安全序列等
死锁检测
资源分布图可以检测是否发生死锁。
与银行家算法区别是没有最大资源请求量的判断,其他的类似。
Ps:死锁检测开销很大,还需要定期扫描。因为开销大,所以操作系统不管死锁的事。
死锁检测算法的使用
选择时间和周期。