死锁避免涉及到的银行家算法(操作系统)

死锁避免属于事先预防策略,但它并不是事先采取限制措施破坏产生死锁的必要条件,而是在资源分配的动态过程中,防止系统进入不安全状态,从而避免发生死锁。这种方法所施加的措施不严,可以使系统的性能得到有效的发挥。

一:系统安全状态

   避免死锁的方法中,允许进程动态的申请资源,但系统在进行资源分配之前,应先计算分配资源后是否会进入不安全状态。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,拒绝分配。

   安全状态即指,系统能按某种进程推进序列{P1,P2......Pn}来为每个进程Pi分配所需的资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序完成,此时称P1,P2,..........Pn为安全序列。若系统无法找到一个安全序列,则称此系统为不安全状态。

  并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便有可能发生死锁。反之,若系统处于安全状态,便可避免发生死锁。(除非新加入进程)

二:银行家算法

  银行家算法是著名的死锁避免算法,其思想是:把操作系统视为银行家,操作系统管理的资源视为银行家所管理的资金,进程向操作系统申请分配资源相当于用户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次向系统申请资源时,系统要测试该进程对资源的最大需求量,若系统现存的资源可以满足他的最大需求量,则按当前申请的资源数目分配给它;否则,就推迟分配。当该进程在运行过程中再次申请资源时,测试申请的资源数目和已分配的资源数目之和是否大于最大需要量,若超过,则拒绝分配。若没有超过,则测试该进程尚需资源的最大需求量是否小于当前系统现有的资源,若能满足则按当前申请的资源数目分配。否则,推迟分配。

(1)数据结构描述

可利用资源向量Available:含有m个元素的数组,其中每个元素代表一类可用的资源数目,Available[j]=k表示Rj类资源有k个

最大需求矩阵Max:n×m矩阵,定义系统中n个进程中的每个进程对m类资源的最大需求量。直接来说,一行代表一个进程,一列代表一类资源。Max[i,j]=k表示第i个进程需要Rj类资源k个。

分配矩阵Allocation:n×m矩阵,定义系统中n个进程中的每个进程当前已分配的m类资源的数目。Allocation[i,j]=k表示当前进程i已分配j类资源k个。

需求矩阵Need:n×m矩阵,定义系统中n个进程中的每个进程当前还需要的m类资源的数目。Need[i,j]=k表示当前进程i需要m类资源k个。

Need=Max-Allocation

(2)银行家算法描述

设  Request _i是进程Pi的请求向量,Request_i[j]=k表示进程 i 仍然需要 j 类资源k个。当Pi发出资源请求后,系统按如下步骤进行检查:

  1. 若Request_i[j]<=Need_i[j] ,则转向步骤2;否则认为出错,因为它所要求申请的资源已经超出它所需要的最大值。
  2. 若Request_i[j]<=Available_i[j],则转向3;否则认为没有足够的资源,进程Pi尚需等待;
  3. 系统试探着把资源分配给进程Pi,并修改以下两个数据的值                                                                                                                Available_i[j]=Available_i[j]-Request_i[j]                                                                                                                                  Allocation_i[j]=Allocation_i[j]+Request_i[j]                                                                                                                                Need_i[j]=Need_i[j]-Request_i[i]
  4. 系统执行安全性算法,检查此次匹配之后,系统是否处于安全状态,若处于安全状态,则完成此次分配,并让系统继续运行。否则,此次的分配作废,系统收回此次分配的资源,进程Pi处于等待状态。

(3)安全性算法

  1. 初始时安全序列为空
  2. 从Need矩阵中找出一行小于Available的元素,且该行 i 对应的进程Pi不在安全序列内,若找到,则将该Pi进程加入安全序列,转 3;否则,若找不到的话,转4.
  3. 进程Pi进入安全序列后,可顺利执行直至完成,完成后可释放该进程Pi所需要的资源,则可以令Available=Allocation[i]+Available,转2
  4. 若此时安全序列包含所有进程,则说明分配资源后系统处于安全状态;否则,系统处于不安全状态。

三:安全性算法举例

假设系统中有5个进程{P1,P2,P3,P4,P5}和三类资源{A,B.C},各种资源的数量分别为10、6、8,在T0时刻的资源分配情况见下表所示

进程\资源情况

Max

A B C

Allocation

A B C 

Available

A B C

P1 7 6  4 2  3  3  1 3  1
P2 3 1  2 1  0  0
P3 1 2 5 0  2  2
P4 2 3 1  2  1  1
p5 1 1 2 0  1  0

 

(1)从图中可以看到各个进程对应的Max和Allocation矩阵,进而两者相减可以得到各个进程的Need矩阵

P1 7 6 4 2 3 3 5 3 1
P2 3 1 2 1 0 0  2 1 2
P3 1 2 5 0 2 2 1 0 3
P4 2 3 1 2 1 1 0 2 0
P5 1 1 2 0 1 0 1 0 2

(2)然后将Need矩阵与Available进行比较,哪行符合Need<=Available

  P4  (0,2,0)<(1,3,1)  Available=(1,3,1)+(2,1,1)=(3,4,2)

然后 P2符合 Available=(3,4,2)+(1,0,0)=(4,4,2)

然后P5符合 Available=(4,4,2)+(0,1,0)=(4,5,2)

找不到安全序列,此时系统处于不安全状态
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章