1 总览
2 死锁预防
1 破坏互斥条件
使用SPOOLing技术
缺点:并不是所有资源都可以改成可共享的资源,并且为了系统安全,很多时候必须保持这种互斥性,因此很多时候都无法破坏互斥条件
2 破坏不剥夺条件
两种策略:
- 我得不到想要的,就把我占有的释放(无私,成全别人)
- 借助操作系统协助,将想要的资源强行抢来,一般需要考虑各进程的优先级
缺点: - 实现起来比较复杂
- 释放已获得的资源可能会造成前一阶段工作的失效,因此这种方法只适用于易保存和恢复状态的资源,如cpu
- 反复申请和释放资源会增加系统开销,降低系统吞吐量
- 若采用方案一,意味着只要暂时得不到某个资源,之前获得的都要放弃,以后重新申请,如果一直发生就会导致进程饥饿
3 破坏请求并保持条件
策略:
进程在运行之前一次申请完所有需要的资源,在资源未满足之前不让它投入运行,一旦运行,这些字眼就一直归他所有,该进程就不会申请别的任何资源
缺点:
- 有些资源可能只要使用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率低,也可能导致某些进程饥饿
造成饥饿:A类用R1,B类用R2,C类俩都用,AB的不断用,C的就可能弄不着用
4 破坏循环等待条件
策略:
顺序资源分配法:先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完
一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源,按此规则,已持有大编号资源的进程不可能逆向回来申请小编号的资源,从而就不会产生循环等待的现象
缺点:
- 不方便添加新的设备,因为可能需要重新分配所有的编号
- 进程实际使用资源的顺序可能和编号递增的顺序不一直,会导致资源的浪费,如,我要先用5,很久后用3,只能把3先申请占着,就浪费了.
5 总结
注意去分析哲学家进餐中策略避免死锁所对应的方法
3 死锁避免
1 安全序列,不安全状态,死锁的联系
- 安全序列:指系统如果按照这种序列分配资源,则每个进程都能顺利完成
- 只要能找到一个安全序列,系统就是安全状态,安全序列可能有多个
- 在分配了资源后,系统找不到任何一个安全序列,系统就进入不安全状态,意味着之后可能所有进程都无法顺利的执行下去,但如果有进程提前归还一些资源,系统有可能回到安全状态,不过分配钱总是要考虑最坏情况
注:1. 如果系统处于安全状态,就一定不会发生死锁
2. 如果系统进入不安全状态,就可能发生死锁
3. 处于不安全状态未必就是发生了死锁(可能还没有去竞争某一资源),但死锁发生时一定是不安全状态
4. 银行家算法的核心思想:在资源分配前预先判断这次分配是否会导致系统进入不安全状态,以此来决定是否答应资源分配请求
2 银行家算法
4 死锁检测和解除
- S为死锁的条件是当且仅当S的状态的资源分配图是不可完全花间的,该条件为死锁定理
- 化简之后还连着边的是死锁进程
死锁解除:
方法:
- 资源剥夺法
- 撤销进程法
- 进程回退法
对谁动手相对而言: - 优先级低的
- 已执行时间短的
- 还有较长时间才能完成的
- 持有资源多的
- 交互式的先不干掉,批处理的先
注意点: - 死锁检测时检查的是资源有向图
- 死锁定理是用于处理死锁的检测死锁的方法