非深入理解操作系统------死锁

死锁的概念

什么是死锁

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

死锁产生的原因

  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) ,有不同的策略,简单的是杀死全部的死锁进程。温和的方式是逐个撤销,直至破坏循环等待链。

猜你喜欢

转载自blog.csdn.net/weixin_41889284/article/details/89485300