在避免死锁问题中常常会用到银行家算法,这个算法的也是由发放贷款的计算方式而得名!就以借款为例子介绍这个算法。
以进程为例,假设有P1,P2,P3,P4,P5这5个进程想向系统请求A ,B ,C 三种资源,他们有以下几个参数:
可利用的资源Available, ( Available[ i , j ]代表第i个进程拥有第j种资源的量)
最大需求量Max,
已经分配的Allocation,
需求量Need
其中 : Need[ i , j ] = Max[ i , j ]-Allocation[ i , j ]
执行银行家算法前先要更具安全性算法对整个系统进行安全性分析,如果安全才可以执行银行家算法,否则不能进行。
安全性算法:
(1)设置两个量:
1-->工作向量Work,表示系统可提供给进程的各类资源量。执行算法开始时,Work :=Available
2-->boolean型的Finish,表示系统可否分配给进程资源,
(2)从进程中找到满足下面条件的进程Pi:
1--> Finish[ i ]=false;
2-->Need[ i , j ] <= Work[ j ];
若找到执行(3),没有就执行(4)
(3) Pi获得资源,执行完后,释放资源:
Work [ j ] := Work [ j ]+Allocation[ i , j ];
Finish[ i ] :=true;
返回(2)。
(4)如果系统所有进程Finish[ i ] :=true则系统安全。
银行家算法;
(1) 若Request i [ j ] <=Need[ i , j ],转向(2),否则请求不合理!
(2) 若Request i [ j ] <=Allocation[ i , j ],转向(3),否则请求无法满足!
(3)系统尝试以下计算:
Available[ j ]:=Available[ j ]-Request i[ j ];
Allocation[ i , j ] :=Allocation[ i , j ]+Request i[ j ];
Need[ i ,j ] :=Need[ i , j ]-Request i[ j ];
(4) 系统执行安全算法,检查是否分配资源后依然安全!若安全则真正分配,若不安全恢复原本状态!