概念
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,则系统处于安全状态。安全状态一定是没有死锁发生。
不存在一个安全序列。不安全状态不一定导致死锁(有的数上说是一定,不一定的应该是动态分配资源吧)。