处理机调度与死锁(三)

目录

一、预防死锁的方法

1.预防死锁

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

 (2)摒弃”不剥夺“条件

2.系统安全状态★

3.利用银行家算法避免死锁★

(1)银行家算法中的数据结构

(2)银行家算法的处理步骤

(3)安全性算法★

二、死锁的检测与解除

1.死锁的检测

(1)资源分配图

(2)死锁定理

2.死锁的解除 


一、预防死锁的方法

1.预防死锁

预防死锁的方法是使4个必要条件种的第2、3、4条件之一不能成立,来避免发生死锁。

必要条件1,因为它是由设备的固有条件所决定的,不仅不能改变,还应加以保证

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

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

  • 优点:算法简单、易于实现且很安全
  • 缺点:资源浪费严重和进程延迟运行【一次申请所有资源,有的资源被占用但暂时不使用,所以造成资源浪费;其他进程也用不了该资源,这导致其他进程的延迟运行】

 (2)摒弃”不剥夺“条件

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

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

(3)摒弃”环路等待“条件

系统将所有资源按类型进行线性排队,并赋予不同的序号。所有进程对资源的请求必须严格按照资源序号递增的次序提出,这样在所形成的资源分配图中,不可能会出现环路,因而摒弃了”环路等待“条件。

比如有打印机、扫描仪两资源,分别编号为R1、R2,同时有两进程P1、P2。P1必须先申请R1,才能申请R2;P2也是先申请R1,才能申请R2。如此便不会出现环路等待

与前两种策略比较,资源利用率和系统吞吐量都有较明显的改善。但也存在严重问题:

  • 资源编号限制新设备的增加【来了新设备,位于R1和R2之间,不知道怎么编号】
  • 进程使用设备顺序与申请顺序不同,浪费资源;【比如申请了1、2、3、4资源,但1资源到最后才使用,这个资源是严重浪费的】
  • 限制用户编程自由

2.系统安全状态★

预防死锁和避免死锁这两种方法,实质上都是通过施加某些限制条件,来预防发生死锁。预防死锁施加的限制条件较严格,对资源限制比较高,会导致系统的并发度降低,资源利用率降低;避免死锁所施加的限制条件较宽松,这给进程的运行提供了较为宽松的环境,有利于进程的并发执行

  •  避免死锁中,把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可避免发生死锁
  • 允许进程动态地申请资源,但在资源分配前,应先计算资源分配的安全性,若此次分配不会导致系统进入不安全状态,则将资源分配给进程,否则,令进程等待

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

  • 虽然并不是所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之只要处于安全状态就不会死锁【下雨天上高速不安全,但不一定出事】
  • 避免死锁的实质是:系统在进行资源分配时,设法使系统不进入不安全状态

假定系统中有三个进程A、B和C,共有12台磁带机。进程A总共要求10台,B和C分别要求4台和9台。假设在T0时刻,进程A、B和C已分别获得5台、2台和2台,尚有3台未分配,如下表所示:

30c75a18f0644427bafd6b50342d89ac.png

1.T0时刻系统的安全性?

2.T0时刻以后,C又请求1台磁带机,是否可以分配?

 能找到一个进程推进执行的顺序,从而满足每一个进程的资源最大需求,则系统安全,否则不安全

1.T0时刻,可用磁带机3台,分配2台给进程B,进程B执行完后,回收分配给它的资源,此时系统可用资源数量=3+2=5;将这5台分配给进程A,进程A执行完后,回收分配给它的资源,此时系统可用资源数量=5+5=10;接着分配7台磁带机给进程C,C也可以顺利执行完,执行完后系统可用资源=2+10=12,所以系统存在一个合理的进程执行的推进顺序:B-A-C,所以系统在T0时刻是安全的

2.T0时刻,假设分配C1台磁带机,可用磁带机2台,分配2台给进程B,进程B执行完后,回收分配给它的资源,此时系统可用资源数量=2+2=4;这4台既不满足A(还需5台)也不满足C(还需6台),所以A和C无法运行,所以T0以后,系统找不到一个安全的进程推进的执行序列,所以不可以把那1台分配给C

3.利用银行家算法避免死锁★

进程的执行是动态地,在进程动态执行过程中,可能发出对某一类资源的请求,那到底可不可以把这个资源分配给它呢?银行家算法就是先假设把这个资源分配给这个进程,如果会让系统进入一个不安全状态,则不分配

银行家算法是最有代表性的避免死锁的算法。由于该算法能用于银行系统现金贷款的发放而得名

(1)银行家算法中的数据结构

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

①可利用资源向量Available。含有m个元素的一维数组,每个元素代表一类可利用的资源数吗。如果Available[j]=k,表示系统中现有Rj类资源k个

②最大需求矩阵Max,是一个n*m的矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=k,则表示进程i需要Rj类资源的最大数目为k。

③分配矩阵Allocation。为n*m的矩阵,它定义了系统中每类资源当前已分配给每个进程的资源数。Allocation[i,j]=K,表示进程i当前已分得Rj类资源的数目为K

④需求矩阵Need。为n*m的矩阵,表示每个进程尚需的各类资源数。Need[i,j]=K,表示进程i还需要Rj类资源K个,方能完成其任务

三个矩阵间的关系:Need[i,j]=Max[i,j]-Allocation[i,j]

系统中T0时刻的资源分配情况:假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},其中资源的数量分别为10、5、7

e05880dc6d3d4e1d8bf9d6a7b169a442.png

(2)银行家算法的处理步骤

设Requesti[j]=k,表示进程PI需要k个Rj类型的资源

①如果Requesti[j]<=Need[i,j],便转向步骤3;否则认为出错,因为它所请求的资源数已超过它所需要的最大值

②如果Requesti[j]<=Available[j],便转向步骤3;否则,表示尚无足够资源,Pi需等待

③系统试探着把资源分配给进程Pi,并修改下面数据结构中数值

 Available[j]:=Available[j]-Requesti[j];

Allocation[i,j]:=Allocation[i,j]+Requesti[j];

Need[i,j]:=Need[i,j]-Requesti[j];

④系统执行安全性算法,检查此次资源分配后系统是否处于安全状态以决定是否完成本次分配。若安全,则正式分配资源给进程Pi;否则,不分配资源,让进程Pi等待。

(3)安全性算法★

①设置两个向量

工作向量work:表示系统可提供给进程继续运行所需的各类资源数目,含有m个元素的一维数组,初始时,work:=Available;

Finish:含n个元素的一维数组,表示系统是否有足够的资源分配给n个进程,使之运行完成。开始时先令Finish[i]:=false(i=1...n);当有足够资源分配给进程i时,再令Finish[i]:=true。

②从进程集合中找到一个能满足下述条件的进程:Finish[i]=false;Need[i,j]<=work[j];若找到,执行步骤(3),否则执行步骤(4)

③当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

work[j]:=work[j]+Allocation[i,j];Finish[i]:=true;

goto step(2)

④如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态

【举例】系统中T0时刻的资源分配情况:假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},其中资源的数量分别为10、5、7

e05880dc6d3d4e1d8bf9d6a7b169a442.png

求解:①判断T0时刻的安全性

初始时:work=Availabe=[3,3,2],finish=false

2577700012b04661ab5df1591aefb6a5.png

 从进程集合中找到一个能满足下列条件的进程

ⅠFinish[i]=false,nedd[i]<=work=[3,3,2]。P1和P3满足,设先让P1执行,从[3,3,2]中拿出[1,2,2]分配给P1,那么P1就可执行了,执行完后Finish[1]=true,work=[3,3,2]+[2,0,0]=[5,3,2]

40f5c5fc31484678a6ddd4a780da84ec.png

Ⅱ从P0、P2、P3、P4中寻找满足Finish[i]=false,nedd[i]<=work=[5,3,2],所以P3、P4满足,设让P3先执行,从[5,3,2]中拿出[0,1,1]分配给P3,那么P3就可执行了,执行完后Finish[3]=true,work=[5,3,2]+[2,1,1]=[7,4,3]

8ef59cbf1f3e4cbca176eecf4ae9394d.png

 重复以上过程……

929ea7b98c154d3f809cb0ddd054dcfe.png

因为所有进程的finish=true,说明系统是处于安全状态的,存在一个安全执行推进的进程序列{P1P2P4P0P2}(不唯一),所以系统在T0时是安全的

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

利用银行家算法:

ⅠRequest1(1,0,2)<=Need1(1,2,2)

ⅡRequest1(1,0,2)<=Available(3,3,2)

Ⅲ试探分配,修改相关值

Available=(3,3,2)-(1,0,2)=(2,3,0)、Allocation1=(2,0,0)+(1,0,2)=(3,0,2)、Need1=(1,2,2)-(1,0,2)=(0,2,0)

6ab23d8540204f1fb6c41692271cb894.png

Ⅳ再利用安全性算法检查此时系统是否安全

5782ceee51b1440fa75fc7ec9c7feb71.png

624d30aaf9a544f9b54c249df0a38604.png 所有进程的finish=true,说明系统是处于安全状态的,可以立即将P1申请的资源分配给它

求解:③此时,P4请求资源发出请求向量Requset4(3,3,0),系统能否分配给它?

利用银行家算法:

ⅠRequest4(3,3,0)<=Need4(4,3,1)

ⅡRequest4(3,3,0)>Available(2,3,0)

此时P4等待

求解:④此时,P0请求资源发出请求向量Requset0(0,2,0),系统能否分配给它?

利用银行家算法:

ⅠRequest0(0,2,0)<=Need0(7,4,3)

ⅡRequest0(0,2,0)<=Available(2,3,0)

Ⅲ试探分配,修改相关值

Available=(2,3,0)-(0,2,0)=(2,1,0)、Allocation0=(0,1,0)+(0,2,0)=(0,3,0)、Need0=(7,4,3)-(0,2,0)=(7,2,3)

Ⅳ再利用安全性算法检查此时系统是否安全。很容易看出,可利用资源Available(2,1,0)无法满足任一进程的需求,试探作废,不分给P0资源,P0等待

银行家算法总结:

  • 首先判断当前时刻的安全性;(安全性算法)
  • 若安全,当某进程提出资源申请Requesti时,尝试进行预分配(两个比较,并修改相关值);
  • 判断预分配后的安全性;(安全性算法)
  • 若仍安全,则实施预分配;否则,该进程等待

【问题1】 

e108d94ed95a40e888392c6b7440d616.jpeg解:①计算剩余资源——

        A资源:3-1-1=1
        B资源:12-3-3=6
        C资源:14-3-5-3-1=2
        D资源:14-2-4-2-4=2

②需求资源数量

1f1bbafb5a6249dd93297706b2c9566a.png

③根据剩余资源数量来判断执行序列的安全

④看A选项:先执行P1进程,P1进程需求资源数量为(A0、B0、C1、D2),此刻,剩余资源数量(A1、B6、C2、D2)各个资源都大于P1进行需求资源数量,安全,运行完P1进程后,剩余资源数量为(A1、B6、C5、D4)

执行P4进程,P4进程需求资源数量为(0、6、5、2),此刻,剩余资源数量(1、6、5、4)各个资源都大于等于P4进行需求资源数量,安全,运行完P4进程后,剩余资源数量为(1、9、8、6)

执行P5进程,P5进程需求资源数量为(0、6、5、6),此刻,剩余资源数量(1、9、8、6)各个资源都大于等于P5进行需求资源数量,安全,运行完P5进程后,剩余资源数量为(1、9、9、10)

执行P2进程,P2进程需求资源数量为(1、7、5、0),此刻,剩余资源数量(1、9、9、10)各个资源都大于等于P2进行需求资源数量,安全,运行完P2进程后,剩余资源数量为(2、9、9、10)

执行P3进程,P3进程需求资源数量为(2、3、5、6),此刻,剩余资源数量(2、9、9、10)各个资源都大于等于P3进行需求资源数量,安全,运行完P3进程后,剩余资源数量为(3、12、14、14)

此时5个进程运行完毕,所以A选项执行序列正确,同理B选项也正确,答案为【CDE】

【问题2】

fb5c6a1581164dac9c3ff7512cee2834.jpeg

 解:(1)Allocation=MAX-Need,所以该时刻Allocation的值如下:

4a7e32f8758649e0a64e58948f48debc.png

利用安全性算法对上面的状态进行分析(见下表),找到了一个安全序列{P0,P3,P4,P1,P2},故系统是安全的

89d503d42b8e44ffb4a5aeceab9b08db.png

(2)P2发出请求向量Request(1,2,2,2)后,系统按照银行家算法进行检查:

①Request2(1,2,2,2)<=Need2(2,3,5,6)

②Request2(1,2,2,2)<=Available(1,6,2,2)

③系统先假定可为P2分配资源,并修改Acailable,Allocation2和Need2向量:

Available=(0,4,0,0)

Allocation2=(2,5,7,6)

Need2=(1,1,3,4)

④进行安全性检查:此时对所有的进程,条件Needi<=Available(0,4,0,0)都不成立,即Available不能满足任何进程的请求,故系统进入不安全状态

因此,当进程P2提出请求Request(1,2,2,2)后,系统不能将资源分配给它

(3)系统立即满足进程P2的请求(1,2,2,2)后,并没有马上进入死锁状态。因为,此时上述进程并没有申请新的资源,并因得不到资源而进入阻塞状态。只有当上述进程提出新的请求,导致所有没执行完的多个进程因得不到资源而阻塞并形成循环等待链时,系统才进入死锁状态。

二、死锁的检测与解除

1.死锁的检测

当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此系统必须:

  • 保留有关资源的请求和分配信息;
  • 提供一种算法,以利用这些信息来检测系统是否已进入死锁状态

(1)资源分配图

系统死锁可利用资源分配图来描述。该图由表示进程的圆圈和表示一类资源的方框组成,其中方框中的一个点代表一个该类资源,请求边是由进程指向方框中的rj,而分配边则应始于方框中的一个点

6f2f4ce0398f46f0a201028ced1f6112.png

(2)死锁定理

我们可以利用资源分配图加以简化的方法来检测系统处于某状态时是否为死锁状态。简化方法如下:

  • 在资源分配图中找出一个既不阻塞又非独立的进程节点Pi,在顺利的情况下运行完毕,释放其占有的全部资源
  • 由于释放了资源,这样能使其他被阻塞的进程获得资源继续运行
  • 在经过一系列简化后若能消去图中的所有的边,使所有进程节点都孤立,则称该图是可完全简化的,反之是不可完全简化的

可以证明:S状态为死锁状态的充分条件当且仅当S状态的资源分配图是不可完全简化的<死锁定理>

2.死锁的解除 

当发现进程死锁时,便应立即把它们从死锁状态中解脱出来。常采用的方法是:

  • 剥夺资源:从其他进程剥夺足够数量的资源给死锁进程以解除死锁状态
  • 撤销进程:最简单的是让全部进程都死掉;温和一点的是按照某种顺序逐个撤销进程,直至有足够的资源可用,使死锁状态消除为止

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值