OS复习笔记ch6-2

死锁的解决

  1. 死锁的预防(打疫苗)
  2. 死锁的避免(戴口罩)
  3. 死锁的检测(做核酸)

死锁的预防

前面我们提到了死锁的四个必要条件

  • 防止前三个必要条件,就是间接预防
  • 防止最后一个必要条件–循环等待,就是直接预防

接下来我们讨论一下这四个条件如何预防

  1. 互斥访问:系统属性不可修改,必须支持
  2. 保持和请求:要求一次性请求所需的全部资源
    • 进程得到资源前要阻塞很长时间
    • 降低了系统利用率和并发程度
    • 有可能无法预先知道所需资源
  3. 不可剥夺:修改为可剥夺
    1. OS可以实现,适用于资源的使用状态可以保存并恢复
    2. 处理器和内存的资源可剥夺(上下文、页面置换算法)
  4. 循环等待:
    1. 需要定义一个资源类型的线性序,资源在申请的时候必须按照这个序
    2. 效率不高,减缓了进程的推进,以及不必要地拒绝资源访问

死锁的避免

系统需要动态作出决定:如果当前资源分配请求满足,是否会导致死锁。

  • 需要未来的进程资源请求
  • 动态判定当下情况有没有可能发生死锁

两种方式:

  1. 拒绝进程启动:如果进程资源请求可能导致死锁则不启动进程

  2. 拒绝资源访问:如果本次分配可能导致死锁,则拒绝进程的增量资源请求

拒绝进程启动

系统中有n个进程,m种资源

image.png

  • R是资源总数矩阵
  • V是可用的资源矩阵
  • claim是最大需求矩阵
  • allocation是已经分配的资源矩阵

保守策略
image.png

e.g.
image.png
假设银行有账面200万,有三个客户来贷款,总量分别是100、80、60万。按照保守策略,银行对第一个用户和第二个用户贷款申请可以批准一次付清,但是第三个用户就不能批准了,相当于拒绝了第三个用户的贷款申请(类比进程启动)。

拒绝资源分配

著名的银行家算法

假设按照上述案例,银行分批贷款,第一次分配完后账面只剩下10万,此时第二轮分期只能给user2,否则user1和3满足不了,后期也收不回本金。所以,银行只能一直拒绝两者的催款直到user2还款。(类比系统资源,OS会根据当前状况动态决定资源分配,是否需要拒绝进程的资源申请)。

这里就要找到安全序列,该序列可以依次满足不同用户的最大需求。

来看OS如何进行资源分配
image.png

R = V + A(资源总数 = 可用资源+已经分配的资源)

这里遍历矩阵C - A每行和V对比,找到某个在有限时间内可以执行完将资源归还给系统的进程。经过多次分配,直到所有进程运行完毕,然后得到安全分配序列。
如上图,能符合011的就只有P2进程可以满足,也就是说OS接下来只能一次满足P2进程的资源申请要求,此时安全队列中加入P2。P2执行结束之后释放自己的所有资源,此时可用资源就变成了673。

image.png

同理,我们按照之前的分配策略,可以发现对于这四个进程的唯一安全分配序列是P2→P1→P3→P4.

举一个不安全示例
当进程1在第一次剩余资源分配的时候请求资源R3,如果OS分配出去,会导致进程2也不能满足最大需求,这个时候就找不到安全分配序列,很容易发生死锁,所以之前就要拒绝进程1的资源分配请求。

教科书上给了伪代码,感兴趣的小伙伴可以看一下
image.png

image.png

避免死锁有一些优势,但是缺点也很明显。
优势

  • 不需要如死锁检测一样抢占、回滚进程
  • 同死锁预防相比,资源分配限制少
    缺点
  • 需要提前声明最大资源请求
  • 设计进程独立且无同步需求
  • 分配资源数目固定
  • 当拥有资源时进程不退出

一般通用的OS很难满足上述需求,所以只能是理论上分析。但是对于一些嵌入式系统,由于代码和硬件固化,或许可以按照银行家算法去设计避免死锁。

死锁的检测

检测频率

检测的频率如何控制呢?
如果每次资源请求的时候都检查是否有死锁,系统开销就会很大

两个思路

  • 进程阻塞时间过长则检测
  • 资源利用率下降则检测

这里可以使用拓扑排序找资源分配回路(需提前简化,以防伪回路)
这个涉及图论中的邻接矩阵的表示,利用的也是前面的V、A,还有一个请求矩阵Q
所有进程都要先打上“未死锁”标签,然后检查进程序列的标签中是否有“死锁”

具体执行过程见PPT,这里不做重点
image.png
image.png

image.png
让我们来分析一些各个进程的情况:
首先,p4肯定没问题,因为它的的分配矩阵行全为0,第一步就被标记了。p3在p4的基础上没问题,因为执行第三步的时候发现p3满足条件1,于是第四步p3被标记。
而p1、p2死锁,因为返回到步骤三发现此时已经找不到符合条件的进程了,检测终止,此时两个进程未标记符合死锁条件。

当然,也可以用上一节学的进程请求/资源分配图来看,更直观一些。

恢复策略
  • 中止所有死锁进程
  • 死锁进程回退到某个预定义的检查点,重新启动所有进程(下一次可能还会发生死锁)
  • 依次中止死锁进程,可以逐步解决
  • 剥夺进程死锁的资源

而上述选择中止的死锁进程准则

  • 到目前为止,使用处理器时间最少(有效执行时间最短)
  • 到目前为止,产生输出最少(比如写数据最少)
  • 估计剩余的执行时间最长(第九章调度策略)
  • 到目前为止,分配资源最少的(拥有的资源最少)
  • 考虑进程的优先级最低的进程

亦可以采用复合准则加权统一各个原则

综合死锁策略

举例

  • 将各种资源归入若干不同的资源类
  • 每一类资源使用线性序申请预防
  • 对同一资源类中的资源,采用适当的方法

例如数据库管理系统

  • Swappable space: 对换用的磁盘块(空间足够),一次性分配所需所有资源来预防或死锁避免
  • Process resources: 可分配资源(磁带机、文件),避免或基于资源排序的预防
  • Main memory: 页或段,基于剥夺的预防
  • Internal resources: 如 I/O channels,基于资源排序的预防(早期的磁带机等)

总结

image.png

  • 32
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值