死锁
- 死锁问题
一组阻塞的进程持有一种资源等待获取另一个进程所占有的一个资源。
- 系统模型
资源类型:CPU、内存、IO
循环资源 有死锁(p2 p3)
循环资源 无死锁
p2 / p4执行完会释放资源R1 R2 ,从而P1 P3获取到需要的资源。
如果图中无循环=》一定无死锁
如果有循环
1. 资源只有一个实例,有死锁。
2. 资源有多个实例,不一定会死锁。
-
死锁特征
死锁出现后的特征,不能反推。必要条件。
-
死锁处理
完全杜绝死锁的产生可能会对系统执行效率产生较大影响。
死锁预防(打破四个必要条件)- 互斥:数据一致性会有问题。
- 占用并等待:不持有资源,可能产生饥饿。
- 无抢占:如果进程占有某些资源,并请求其他不能被立即分配的资源,则释放当前占有的资源。
- 循环等待:对所有资源类型进行排序,并要求每个进程按照资源顺序进行申请。(嵌入式操作系统应用较多)
死锁避免
安全序列,序列前的所有进程都执行完毕并释放资源,序列后的所有资源也能为己所用。序列前+序列后都可以使用。
死锁避免算法:银行家算法
不安全包括死锁,所以只要判断不安全就可以判断死锁了。
算法核心:判断需要的资源数量(Need)和可以提供的资源数量(Available)的数量关系。
栗子
死锁检测
允许系统进入死锁状态(检测滞后,不是在发出请求的时候,而是在运行的时候进行检测)
死锁检测算法
恢复机制
算法一:资源等待图:判断是否存在环。
算法二:
前提:几个概念
由于死锁检测算法复杂度非常高,所以操作系统很少定期执行 银行家算法和死锁检测。会影响系统性能。银行家算法和死锁检测算法是很类似的。
例子1不存在死锁(request <= allocation+available)
例子2有可能存在死锁
死锁恢复
最实用办法:reboot,确实不是彻底解决办法。目前还没有一个彻底解决死锁的办法。可以作为一个研究方向。