您的位置:首页 > 其它

死锁避免:银行家算法

2016-05-19 15:01 169 查看

概念

Dijksta提出(1965): 仿照银行家发放贷款时采取的控制方式而设计的一种死锁避免算法。


应用条件

固定数量的进程中共享数量固定额资源

每个进程预先制定完成工作所需的最大资源数量

进程不能申请比系统中可用资源总数还多的资源

进程等待资源的时间是有限的。

如果系统满足了进程对资源的最大需求,那么进程应该在有限的时间内使用资源,然后

归还给系统。

具体实现

算法结构

可利用资源向量Available  ARRAY[1…m]of interger

是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。   

最大需求矩阵Max   ARRAY[1…n,1…m]of interger

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

分配矩阵Allocation  ARRAY[1…n,1…m]of interger 

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

需求矩阵Need   ARRAY[1…n,1…m]of interger

这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。   

Need[i,j]=Max[i,j]-Allocation[i,j]

Request ARRAY[1…n,1…m]of interger

本次进程对资源的申请多少。

注释:为了方便一下简写为:AVAILABLE;Max[i]; Allocation[i]; Need[i]; Request[i]

银行家算法具体实现:

当进程Pi提出资源申请时,系统执行下列步骤:

1. 如果Request[i]<= Need[i] ,则转(2) ;否则,报错返回。

2. 如果Request[i]<= AVAILABLE[i] ,则转(3) ;否则,进程等待。

3. 假如系统分配资源,则有:

AVAILABLE[i]=AVAILABLE[i]-Request[cusneed][i];

Allocation[cusneed][i]=Allocation[i]+Request[cusneed][i];

Need[i]-=Request[i];

到此时系统进入了一个新的状态,需要进行判断

4. 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状, 进程等待。

安全性检查算法

数据结构

Work ARRAY[1…m]of interger

Finish ARRAY[1…m]of Boolean

安全性检查步骤

(1) Work=AVAILABLE;

FINISH = false;

(2) 从进程集合中找到一个满足下述条件的进程i,

Finish[i]==false;

Need[i]<=Work;

如找到,执行(3) ; 否则,执行(4)

(3) 设进程获得资源,可顺利执行,直至完 成,从而释放资源。

Work+=ALLOCATION[i];

Finish[i]=true;

转到(2)

(4) 如所有的进程i,Finish= true ,则表示安全;否则系统不安全。

操作系统安全状态和不安全状态:   

全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不存在一个安全序列。不安全状态不一定导致死锁(有的数上说是一定,不一定的应该是动态分配资源吧)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息