操作系统——死锁(一文详解死锁,死锁产生的原因和死锁的解决方案)

1、什么是死锁?死锁产生的条件?

1.1、什么是死锁?

答: 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态

1.2、死锁产生的四个必要条件?

  • 互斥条件: 一个资源一次只能被一个进程使用;
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放
  • 不剥夺条件: 进程获得的资源,在未完全使用完之前,不能强行剥夺;
  • 循环等待条件: 若干进程之间形成一种头尾相接的环形等待资源关系。

1.3、如何处理死锁问题?

  • 忽略该问题:例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像;
  • 检测死锁并且恢复;
  • 仔细地对资源进行动态分配,以避免死锁
  • 通过破除死锁四个必要条件之一,来防止死锁产生。

2、死锁的解决办法

  • 预防死锁: 通过破坏死锁四个必要条件之一,来防止死锁产生;
  • 避免死锁: 在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁;
  • 检测死锁: 允许进程在运行过程中发生死锁,但是可以通过检测机构及时检测出死锁,然后通过合适的措施,把进程从死锁过程中解脱出来;
  • 解除死锁: 当检测系统中已经发生死锁时,就采用相应措施,将进程从死锁状态中解脱出来。
  • 忽略死锁: 比如:鸵鸟算法,当系统发生死锁时不会对用户造成多大影响,或系统很少发生死锁的场合。

3、预防死锁

3.1、破坏“不抢占”条件

答:当某个进程请求新的资源得不到满足时,便立即释放保持的所有资源,待以后需要时再重新申请。

缺点是实现复杂,抢占资源可能导致部分工作失效,反复申请和释放导致系统开销很大,也可能导致饥饿。

3.2、破坏“请求和保持”条件

答:我们必须保证:当一个进程在请求资源时,它不能持有不可抢占的系统资源。在此,有两种协议可供选择:

  • 第一种协议: 该协议规定,所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。此时若系统有足够的资源分配给某进程,便可把其需要的所有资源分配给它,这样,该进程在整个运行期间,便不会再提出资源要求,从而破坏了“请求”条件。系统在分配究源时,只要有一种资源不能满足进程的要求,即使其它所需的各资源都空闲也不分配给该进程

    第一种协议虽然简单易行且安全,但是它导致资源被严重浪费,严重的降低了资源的利用率;进程会经常发生饥饿现象。 因此比较推荐第二种协议。

  • 第二种协议: 该协议是对第一种协议的改进,它允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。

3.3、破坏“循环等待”条件

答:

  • 具体做法: 首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源) 一次性申请完;
  • 原理: 一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象,进而预防死锁的发生。

缺点

  • 不方便增加新的设备,因为可能需要重新分配所有的编号;
  • 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;
  • 必须按规定次序申请资源,用户编程麻烦。

在这里,我们需要解释一下,为什么产生死锁的必要条件是4个,但是在预防死锁的时候,我们没有介绍怎么破坏互斥条件,理由如下:互斥条件是非共享设备所必备的,不仅不能改变,反而还应该加以保护

4、避免死锁(银行家算法)

答:在避免死锁的方法中,把系统的状态分为两种:安全状态(是指系统能按某种顺序如<P1,P2,…,Pn>(称<P1,P2,…Pn>序列为安全序列),来为每个进程分配其所需资源,直到最大需求,使每个进程都可顺序完成。)和不安全状态,当系统处于安全状态时,可以避免死锁的发生,反之,当系统处于不安全状态时,可能导致死锁的发生。

当有一个进程请求一个可用资源时,系统需要对该进程的请求进行计算,若将资源分配给进程后系统仍处于安全状态,才将资源分配给该进程。

5、死锁的检测与解除

答: 为了能对系统中是否已经发生了死锁进行检测,在系统中必须:

(1)保存有关资源的请求和分配信息;

(2)提供一种算法,它利用这些信息来检测系统是否进入死锁状态

在这里插入图片描述

5.1、检测死锁的算法中

  • 在资源分配图中,找出既不阻塞又非独立的进程结点Pi,在顺利的情况下,Pi可以得到所需的资源而继续运行,直至完成,然后释放它所占有的所有资源。这相当于消去它所有的请求边和分配边,使之称为孤立的结点。
  • 进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。然后重复上面的过程,消去请求边和分配边。
  • 若能消去图中所有的边,使得图中的进程结点变为孤立点,则称该图是可完全简化的,否则称该图是不可完全简化的。

有文献证明: 所有的简化顺序都将得到相同的不可简化图。
死锁定理表明: 如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

5.2、解除死锁

  • 抢占资源: 从一个或者多个进程中抢占足够多数量的资源,分配给死锁进程,以解除死锁。
  • 终止进程法(包括终止所有死锁进程和逐个终止进程): 终止系统中的一个或多个死锁进程,纸质打破循环环路,使系统从死锁状态中解脱出来。
  • 进程回退法。