死锁

死锁的概念

什么是死锁

死锁是指多个进程在运行的过程中因资源竞争而造成的一种僵局,如果没有外力作用,他们都不会向前推进

死锁产生的原因

  1. 对资源的竞争
  2. 进程间的推进顺序不当(银行家算法)
产生死锁的四个必要条件

1. 互斥

进程对所分配到的资源进行排他性使用,如果此时还有其他进程请求该资源,请求者只能等待,直到占有该资源的进程释放资源。

2. 请求和保持

进程A已经保持了至少一个资源,但又提出了新的资源请求,而且该资源又被其他进程B占用,此时请求进程阻塞,但又对其获得的资源保持不放

3. 不可剥夺

指进程已经获得的资源,在未使用完之前,不能被剥夺,只能自己用完时主动释放。

4. 环路等待

存在一个进程和资源的环形链。进程集合p0, p1, p2,pn中,p0正在等待p1占用的资源,p1正在等待p2占用的资源,p2正在等待pn占用的资源,pn正在等待p0占用的资源。

死锁的处理

死锁预防(执行前)

死锁的预防可以从破坏产生死锁的四个必要条件着手

破坏 ‘请求和保持’ 条件

所有进程在开始运行之前,都必须一次性申请它在整个运行过程所需的全部资源。这样,该进程在运行期间就不会发出资源请求,也就是说破坏了请求的条件
只要缺少一种资源,系统也不会分配任何资源给该进程,只能让其等待。这样就破坏了保持的条件。

优点 是实现简单,并且很安全。

缺点 是它会严重浪费系统资源,因为进程一次性获得所需的全部资源,而其中有些资源可能使用的时间极短,这样就严重降低了资源的利用率。同时,它会使进程延迟执行,降低响应比

破坏 ‘不可剥夺’ 条件

当一个进程在已经保持了一部分资源的情况下,又去申请新的资源,如果不能立即得到满足时,必须释放它所保持的全部资源。

这种策略显著的缺点是,会导致对资源频分的申请和释放,导致进程被无限推迟执行。降低了系统的吞吐量。

破坏 ‘环路等待’ 条件

采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程

死锁的避免(执行时)

在避免死锁的策略中,允许进程动态的申请资源,但是系统在进行资源分配之前,应该先计算此次资源分配的安全性。如果此次分配不会导致系统进入不安全状态,则将资源分配给该进程,否则,让该进程等待。

安全状态,就是指系统能按某种进程顺序(P1, P2, P3, ..., Pn) ,来为每个进程 Pi 分配所需的资源,直至满足每个进程对资源的最大需求,使每个进程都能顺利的完成。(如果找不到这个安全序列,则系统处于不安全状态).

银行家算法避免死锁

死锁的检测与解除(死锁发生后)
  • 允许死锁发生
  • 保存有关资源的请求和分配信息, 并提供检测算法
  • 检测时机 CPU利用率低于某一值

死锁检测的手段-资源分配图
在这里插入图片描述
其中圆圈代表一个进程,方框代表一种资源
e = {pi, rj} 是资源请求边,代表进程 pi 请求一个单位的 rj 资源
e = {rj, pi} 是资源分配变,把一个单位 rj 分配给 pi 进程

可以利用把资源分配图简化的方法来检测是否处于死锁状态

  1. 在图中,找出一个可孤立的节点p1。该节点代表即不阻塞又不独立的进程,pi 可获得所需资源并执行成功,释放资源,此时可以消去 pi 的资源请求边和分配边。
  2. p1 释放资源后,可以使 p2 申请到资源并继续运行。消边后,p2 也称为孤立节点。
  3. 如果该图不可完全简化(存在某些边不能消去), 那么进程间就处于死锁状态。

死锁的解除
常用的两种方法是

  1. 剥夺资源,从其它进程剥夺足够的资源给死锁进程,解除死锁状态
  2. 撤销进程 (kill) ,有不同的策略,简单的是杀死全部的死锁进程。温和的方式是逐个撤销,直至破坏循环等待链。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值