预防死锁的方法以及死锁的检测与解除

3.6 预防死锁的方法

一、预防死锁

二、系统安全状态

三、利用银行家算法避免死锁

预防死锁和避免死锁这两种方法,实质上都是通过施加某些限制条件,来预防发生死锁:
两者的区别主要在于:
  • 预防死锁:
    施加的限制条件比较严格,往往会影响进程的并发执行。
  • 避免死锁:
    施加的限制条件比较宽松,这给进程的运行提供了较为宽松的环境,有利于进程的并发执行。

一、预防死锁

产生死锁的必要条件
  • 1、互斥条件
  • 2、请求和保持条件
  • 3、不剥夺条件
  • 4、环路等待条件
预防死锁的方法是使四个必要条件中的第2,3,4条件之一不能成立,来避免发生死锁。
必要条件1,因为它是由设备的固有条件所决定的,不仅不能改变,还应加以保证。

1、摒弃“请求和保持”条件

系统规定所有进程在开始运行之前,都必须一次性的申请其在整个运行过程中所需的全部资源。此时若系统有足够的资源就分配给该进程,该进程在运行期间不会提出资源要求,从而摒弃了“请求”条件。若系统没有足够的资源分配给它,就让该进程等待。因而也摒弃了“保持”条件,从而避免发生死锁。

  • 优点:算法简单、易于实现且很安全。
  • 缺点:资源浪费严重和进程延迟运行。

2、摒弃“不剥夺”条件

系统规定,进程是逐个地提出对资源的要求的。当一个已经保持了某些资源的进程,提出新的要求不被满足时必须释放它已经保持的所有资源,待以后需要时再重新申请。从而摒弃了“不剥夺”条件。

  • 某一进程已经占有的资源,在运行过程中会被暂时释放掉,认为是被剥夺了。
  • 实现起来比较复杂且付出很大代价。可能会前功尽弃,反复申请和释放等情况,延长了周转时间,增加系统开销。

预防死锁的方法以及死锁的检测与解除_第1张图片

与前两种策略比较,资源利用率和系统吞吐量都有较明显的改善。但也存在着严重问题:
  • 1、为资源编号限制新设备的增加;
  • 2、进程使用设备顺序与申请顺序不同,浪费资源
  • 3、限制用户编程自由。

二、系统安全状态

在预防死锁的几种方法中,都施加了较强的限制条件;在避免死锁的方法中,所施加的限制条件较弱,又能获得令人满意的系统性能。
该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可避免发生死锁。

思路:

允许进程动态地申请资源,但在资源分配前,应先计算资源分配的安全性,若此次分配不会导致系统进入不安全状态,则将资源分配给进程,否则,令进程等待。

安全状态

预防死锁的方法以及死锁的检测与解除_第2张图片

预防死锁的方法以及死锁的检测与解除_第3张图片

1、是否可以找到一个进程推进执行的顺序,从而满足每一个进程资源的最大需求,如果能则系统安全,否则不安全。
  • T0时刻:可用的有3台,可以先分配给进程B2台,然后B可以执行,执行完成以后释放4台,加上可用的1台,再分配给A,A执行完成以后,释放全部资源10台,再拿出9台可以分配给C。
  • 所以系统存在一个合理的进程执行的推进顺序:B-A-C,因此在T0时刻系统是安全的。
2、T0以后,如果C再申请一台,那么剩下可用的还有两台,则这两台可以分配进程B,B执行完以后释放4台,此时A需要5台,C需要6台,进程A和C都不能继续执行,就无法进行分配,这样系统是不安全的。

三、利用银行家算法避免死锁

预防死锁的方法以及死锁的检测与解除_第4张图片

预防死锁的方法以及死锁的检测与解除_第5张图片

预防死锁的方法以及死锁的检测与解除_第6张图片

预防死锁的方法以及死锁的检测与解除_第7张图片

3、安全性算法

预防死锁的方法以及死锁的检测与解除_第8张图片
预防死锁的方法以及死锁的检测与解除_第9张图片

银行家算法例题

预防死锁的方法以及死锁的检测与解除_第10张图片

(1)判断T0时刻的安全性

1、初始时work= available,finish = FALSE
2、从进程集合中找到一个能够满足下列条件的进程:
 finish[i] = false, need[i,j] <= work,则 P1,P3满足条件。
 假设让P1先执行,从【3,3,2】中拿出【1,2,2】分配给P1,那么P1可以执行,执行完以后释放资源,
 则work=【2,1,0】+【3,2,2】=【5,3,2】且finish[1] = true。
 从P0,P2,P3,P4中找出满足finish[i] = false, need[i,j] <= work的条件。
 发现P3和P4满足条件,假设让P3先执行。
 则从【5,3,2】中拿出【0,1,1】分配给P3,P3可以执行,执行完以后释放资源。
 则work = 【5,3,2】+【2,1,1】=【7,4,3】,且finish[3] = TRUE。
依据该思路继续执行,直到所有进程全部完成!

预防死锁的方法以及死锁的检测与解除_第11张图片

因为所有进程的finish=TRUE,说明系统是处于安全状态的
存在一个安全执行推进的进程序列{P1,P3,P4,P0,P2},所以系统在T0时刻是安全的。

(2)T0时刻P1请求资源发出请求向量Request1(1,0,2),系统能否分配给它?

预防死锁的方法以及死锁的检测与解除_第12张图片

此时T0时刻新的资源分配表为

预防死锁的方法以及死锁的检测与解除_第13张图片

再利用安全性算法检查此时系统是否安全,如下所示:

预防死锁的方法以及死锁的检测与解除_第14张图片

由所进行的安全性检查可知,可以找到一个安全序列{P1,P3,P4,P0,P2},因此系统是安全的,可以立即将P1所申请的资源分配给它。

预防死锁的方法以及死锁的检测与解除_第15张图片

预防死锁的方法以及死锁的检测与解除_第16张图片
预防死锁的方法以及死锁的检测与解除_第17张图片

3.7 死锁的检测与解除

一、死锁的检测
二、死锁的解除

一、死锁的检测

当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此系统必须:
  • 1、保存有关资源的请求和分配信息;
  • 2、提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。
    预防死锁的方法以及死锁的检测与解除_第18张图片
方框指向进程是分配资源,进程指向方框是请求资源。

预防死锁的方法以及死锁的检测与解除_第19张图片

二、死锁的解除

当发现进程死锁时,便应立即把它们从死锁状态中解脱出来。常采用的方法是:
  • 1、剥夺资源:从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态。
  • 2、撤销进程:最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止。

你可能感兴趣的:(计算机操作系统,操作系统,银行家算法,死锁,解除死锁,死锁定理)