1. 死锁原理
死锁 | 一组相互竞争系统资源或通信的进程发生”永久阻塞” | |
---|---|---|
系统资源 | 可重用 reusable |
一次仅供一个进程安全使用且不会因为使用而耗尽,数量有限 死锁情况:两个进程分别占有一个资源,但都请求对方占有的资源,产生死锁 |
可消耗 consumable |
可被生产/消耗的资源,数量通常无限 |
死锁情况:参考: Ch5 4.2交换consumer中两语句—产生死锁 ,很多事件组合都会导致死锁 |
2. 死锁的条件
| | 死锁的必要条件
- 互斥:一次只有一个进程可以使用一个资源
- 占有且等待: 一个进程等待其他进程时,继续占有已分配资源
- 不可抢占: 不能抢占其余进程已占有资源
额外条件,组成充要条件
- 循环等待:形成闭合链,阻塞的进程间互相等待其他进程释放资源
|
| —- | —- |
| 死锁的处理方法有三种:预防(prevent),避免(avoid),检测(detect),主要针对四种死锁条件处理 | |
3. 死锁预防
死锁预防可从四种死锁条件入手
①互斥 | 操作系统普遍实现,不具备禁止条件 |
---|---|
②占有且等待 | 一次性请求所需资源,确保后续无等待 |
👹问题:低效,可能长时间阻塞以等待资源 |
| ③不可抢占 | 👹问题:第二种额外抢占需要满足优先级不同,且两种实现都需要系统可以容易保存与恢复进程状态 |
| ④循环等待 | 若AB死锁,可能是A占有Ri,请求Rj,B占有Rj请求Ri,因此杜绝B的请求就能防止死锁
👹问题:低效,产生长时间阻塞或者无必要的拒绝 |
4. 死锁避免
资源向量化 | |
---|---|
**进程启动拒绝 |
(死锁避免策略)** | ![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. 死锁检测
| 死锁检测和死锁预防的区别:
预防策略很保守,属于”未雨绸缪”但检测算法属于不限制系统的资源分配,但定期执行算法检测当前是否有死锁,并在有死锁后恢复系统,属于”亡羊补牢” |
| —- |
算法 | 参考: 死锁检测算法 |
---|---|
银行家算法和死锁检测算法本质相同,只是在系统的使用时间在分配资源前后与否 |