操作系统L8
死锁避免
动机
- 在大多数系统中,一次请求一个资源。 希望系统可以决定授予资源是否安全
- 有没有一种算法可以做出正确的决定?
- 我们可以避免死锁,但前提是可以提前获得某些信息
Resource Trajectories 资源轨迹图


- 进入I1、I2、I5、I6包围的矩形时,系统一定会向着造成死锁的矩形区域移动,从而造成死锁
Safe and Unsafe States 安全状态和不安全状态
安全状态
定义
- 如果存在某种调度顺序,即使所有进程突然请求最大数量的资源,每个进程都可以运行完成,(没有死锁发生),则状态是安全的
a可以通过资源分配逐步完成所有进程,说明他是安全的

b是不安全的,他不可以完成A和C

安全状态和不安全状态的区别
- 从安全状态,系统可以保证所有进程都将完成;
- 但是从不安全的状态,就不能给出这样的保证。
单个资源的银行家问题
银行家:操作系统
客户:进程
贷款项目:资源
银行家向一群客户分别承诺了一定的贷款项目
判断对请求的满足是否会导致进入不安全状态
- 如果是,就拒绝
- 如果不是,则分配

a、b是安全的,b可以将空闲资源分配给C,从而获取其他进程所需要的资源
c是不安全的,此时没办法满足任何一个进程
多个资源的银行家系统

总结
银行家算法就是对每一个请求进行检查,检查满足后是否会进入不安全状态。
Starvation
定义:一个进程永远被剥夺必要的资源来处理它的工作
即永远执行不了
Starvation vs Deadlock
- Starvation:线程无限期等待
- 可能结束,但没有外部干预,僵局无法结束
- Deadlock:循环等待资源。
- 是Starvation,反之不成立
- 死锁并不总是确定性的
Deadlock Detection, Deadlock Avoidance, and Deadlock Prevention的比较
Deadlock Detection: 确定是否有死锁
Deadlock Avoidance: 确定系统是否会进入不安全状态
Deadlock Prevention:确保至少一个死锁的必要条件永远不能成立
Deadlock Prevention 死锁预防
确保至少一个死锁的必要条件永远不能成立
破坏互斥条件 Attacking the Mutual Exclusion Condition
如果资源不被一个进程所独占,那么死锁肯定不会产生。

破坏占有并等待条件 Attacking the Hold and Wait Condition
- 要求进程在启动前请求所需要的所有资源
- 问题:很难在运行开始知道需要多少资源
破坏不可抢占条件 Attacking the No Preemption Condition
- 如果一个进程持有一些资源并请求另一个无法分配给它的资源,那么所有资源都会被释放。
- 问题:该方法可以应用于状态可以在以后保存和恢复的资源,例如内存。 不能应用于打印机等资源
破坏环路等待条件 Attacking the Circular Wait Condition
方法一:一个进程在任何时候都只能使用一个资源。
方法二:强加所有资源类型的总排序,并要求每个进程以枚举递增的顺序请求资源。
其他问题
两阶段加锁 two-phase locking
第一阶段:
- 进程试图对所有所需的记录进行加锁,一次锁一个记录
- 如果发现需要的记录被锁了,重新启动
- 加锁成功则开始第二阶段
第二阶段:
- 完成更新
- 释放锁
非资源死锁 Non-resource Deadlocks
Communication Deadlock

可能在信号量中发生

问题


(1)D asks for one more unit:safe state
(2)C asks for one more unit:unsafe state

- 安全状态一定不会发生死锁
- 不安全状态可能是资源数不够满足所有进程造成的,不一定是死锁这种状态
- 死锁一定是不安全状态


- 死锁检测是看当前拥有的资源和请求的资源
- 死锁避免是看当前拥有的资源和进程所需要的最多资源

a = 1, b = 2

p*(m - 1) < r


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yeの博客!