1. 死锁原理

死锁 一组相互竞争系统资源或通信的进程发生”永久阻塞”
系统资源 可重用
reusable
一次仅供一个进程安全使用且不会因为使用而耗尽,数量有限
死锁情况:两个进程分别占有一个资源,但都请求对方占有的资源,产生死锁
可消耗
consumable
可被生产/消耗的资源,数量通常无限

死锁情况:参考: Ch5 4.2交换consumer中两语句—产生死锁 ,很多事件组合都会导致死锁 |


2. 死锁的条件

| image.png | 死锁的必要条件
- 互斥:一次只有一个进程可以使用一个资源
- 占有且等待: 一个进程等待其他进程时,继续占有已分配资源
- 不可抢占: 不能抢占其余进程已占有资源
额外条件,组成充要条件
- 循环等待:形成闭合链,阻塞的进程间互相等待其他进程释放资源
| | —- | —- | | 死锁的处理方法有三种:预防(prevent),避免(avoid),检测(detect),主要针对四种死锁条件处理 | |


3. 死锁预防

死锁预防可从四种死锁条件入手
image.png

①互斥 操作系统普遍实现,不具备禁止条件
②占有且等待 一次性请求所需资源,确保后续无等待
  1. 👹问题:低效,可能长时间阻塞以等待资源 |

| ③不可抢占 | 👹问题:第二种额外抢占需要满足优先级不同,且两种实现都需要系统可以容易保存与恢复进程状态 | | ④循环等待 | 若AB死锁,可能是A占有Ri,请求Rj,B占有Rj请求Ri,因此杜绝B的请求就能防止死锁
👹问题:低效,产生长时间阻塞或者无必要的拒绝 |


4. 死锁避免

image.png

资源向量化 image.png
**进程启动拒绝
  1. (死锁避免策略)** | ![image.png](https://cdn.nlark.com/yuque/0/2020/png/670787/1579323715443-25e04dff-9fb1-43fb-8c26-63628c0eba13.png#align=left&display=inline&height=673&name=image.png&originHeight=673&originWidth=1167&size=268084&status=done&style=none&width=1167) |

| 资源分配拒绝
**
(**银行家算法)⭐ | 参考: 银行家算法例题 | | 进程启动拒绝和资源分配拒绝的区别:
进程启动拒绝是基于假设:新旧进程一起以最大请求访问资源,安全但产生不必要的拒绝;
资源分配拒绝是基于动态判断:当前进程中是否有能够运行结束,当其结束后释放资源能否满足其他进程结束,循环,最终保证所有进程都执行结束 | |


5. 死锁检测

| 死锁检测和死锁预防的区别:
预防策略很保守,属于”未雨绸缪”但检测算法属于不限制系统的资源分配,但定期执行算法检测当前是否有死锁,并在有死锁后恢复系统,属于”亡羊补牢” | | —- |

image.png

算法 参考: 死锁检测算法
银行家算法和死锁检测算法本质相同,只是在系统的使用时间在分配资源前后与否

6. 综合死锁策略

image.png


7. 总结

image.png