死锁的处理策略

1 总览

wzjCQg.png

2 死锁预防

1 破坏互斥条件

使用SPOOLing技术
wzvK4P.png
缺点:并不是所有资源都可以改成可共享的资源,并且为了系统安全,很多时候必须保持这种互斥性,因此很多时候都无法破坏互斥条件

2 破坏不剥夺条件

两种策略:

  1. 我得不到想要的,就把我占有的释放(无私,成全别人)
  2. 借助操作系统协助,将想要的资源强行抢来,一般需要考虑各进程的优先级
    缺点:
  3. 实现起来比较复杂
  4. 释放已获得的资源可能会造成前一阶段工作的失效,因此这种方法只适用于易保存和恢复状态的资源,如cpu
  5. 反复申请和释放资源会增加系统开销,降低系统吞吐量
  6. 若采用方案一,意味着只要暂时得不到某个资源,之前获得的都要放弃,以后重新申请,如果一直发生就会导致进程饥饿

3 破坏请求并保持条件

策略:
进程在运行之前一次申请完所有需要的资源,在资源未满足之前不让它投入运行,一旦运行,这些字眼就一直归他所有,该进程就不会申请别的任何资源
缺点:

  1. 有些资源可能只要使用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率低,也可能导致某些进程饥饿
    造成饥饿:A类用R1,B类用R2,C类俩都用,AB的不断用,C的就可能弄不着用

4 破坏循环等待条件

策略:
顺序资源分配法:先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完
一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源,按此规则,已持有大编号资源的进程不可能逆向回来申请小编号的资源,从而就不会产生循环等待的现象
0SF9N4.png
缺点:

  1. 不方便添加新的设备,因为可能需要重新分配所有的编号
  2. 进程实际使用资源的顺序可能和编号递增的顺序不一直,会导致资源的浪费,如,我要先用5,很久后用3,只能把3先申请占着,就浪费了.

5 总结

0SAA0K.png
注意去分析哲学家进餐中策略避免死锁所对应的方法

3 死锁避免

1 安全序列,不安全状态,死锁的联系

  1. 安全序列:指系统如果按照这种序列分配资源,则每个进程都能顺利完成
  2. 只要能找到一个安全序列,系统就是安全状态,安全序列可能有多个
  3. 在分配了资源后,系统找不到任何一个安全序列,系统就进入不安全状态,意味着之后可能所有进程都无法顺利的执行下去,但如果有进程提前归还一些资源,系统有可能回到安全状态,不过分配钱总是要考虑最坏情况
    注:1. 如果系统处于安全状态,就一定不会发生死锁
    2. 如果系统进入不安全状态,就可能发生死锁
    3. 处于不安全状态未必就是发生了死锁(可能还没有去竞争某一资源),但死锁发生时一定是不安全状态
    4. 银行家算法的核心思想:在资源分配前预先判断这次分配是否会导致系统进入不安全状态,以此来决定是否答应资源分配请求

2 银行家算法

4 死锁检测和解除

  1. S为死锁的条件是当且仅当S的状态的资源分配图是不可完全花间的,该条件为死锁定理
  2. 化简之后还连着边的是死锁进程

死锁解除:

方法:

  1. 资源剥夺法
  2. 撤销进程法
  3. 进程回退法
    对谁动手相对而言:
  4. 优先级低的
  5. 已执行时间短的
  6. 还有较长时间才能完成的
  7. 持有资源多的
  8. 交互式的先不干掉,批处理的先
    注意点:
  9. 死锁检测时检查的是资源有向图
  10. 死锁定理是用于处理死锁的检测死锁的方法