在银行家算法中,若出现如下资源分配[1]情况:Allocation Need AvailableA B C D A B C D A B C DP0: 0 0 3 2 0 0 1 2 1 6 2 3P1: 1 0 0 0 1 7 5 0P2: 1 3 5 4 2 3 5 6P3: 0 3 3 2 0 6 5 2P4: 0 0 1 4 0 6 5 6试问:(1)当前状态是否安全?(2)如果进程P2提出安全请求Request[2]=(1,2,2,2),系统能否将资源分配给它?说明原因.
题目解答
答案
解:(1)当前状态是安全状态。
运行安全性检查算法如下:
1)Work = Available;Finish = false;
2)寻找满足如下条件的i:
Finish[i]==false并且Need[i]≤Work[i];
如果不存在,则转步骤4);
3)Work = Work + Allocation[i];Finish[i] = true;
转步骤2)
4)如果对于所有i,Finish[i] = true,则系统处于安全状态,否则处于不安全状态。
令Work = Available=(1, 6, 2, 3)
运行安全性检测算法,
Finish[0]=false并且Need[0]=(0 0 1 2)<Work,
则Work = Work + Allocation[0]=(1, 6, 2, 3)+(0, 0, 3, 2)=(1, 6, 5, 5);Finish[0] = true;
Finish[3]=false并且Need[3]=(0, 6, 5, 2)<Work,
则Work = Work + Allocation[3]=(1, 6, 5, 5)+(0, 3, 3, 2)=(1, 9, 8, 7);Finish[3] = true;
Finish[4]=false并且Need[4]=(0, 6, 5, 6)<Work,
则Work = Work + Allocation[4]=(1, 9, 8, 7)+(0, 0, 1, 4 )=(1, 9, 9, 11);Finish[4] = true;
Finish[1]=false并且Need[1]=(1, 7, 5, 0)<Work,
则Work = Work + Allocation[1]=(1, 9, 9, 11)+(1, 0, 0, 0 )=(2, 9, 9, 11);Finish[1] = true;
Finish[2]=false并且Need[2]=(2, 3, 5, 6)<Work,
则Work = Work + Allocation[2]=(2, 9, 9, 11)+(1, 3, 5, 4 )=(3, 12, 14, 15);Finish[2] = true;
可以找到一个安全进程序列<p0, p3,p4,p1, p2>,它使Finish[i]=true,对于所有0≤i≤4,因而可以断言系统当前处于安全状态.
(2)运行银行家算法,由于Request[2]=(1, 2, 2, 2)Need[2]=(2, 3, 5, 6),因而请求合法。进一步,Request[2]=(1, 2, 2, 2)Available=(1, 6, 2, 3),故该请求是可以满足的。假设将资源分配给p2,则系统状态变为:
Allocation Need Available
A B C D A B C D A B C D
P0: 0 0 3 2 0 0 1 2 0 4 0 1
P1: 1 0 0 0 1 7 5 0
P2: 2 5 7 6 1 1 3 4
P3: 0 3 3 2 0 6 5 2
P4: 0 0 1 4 0 6 5 6
运行安全性检测算法,Work=Available=(0, 4, 0, 1),Finish[i]=false,此时所有Need[i]Work[i]均不成立,结果Finish[i]均为false,不存在安全进程序列,系统处于不安全状态。系统将取消资源分配并恢复原来状态,进程p2等待。
解析
1.1 初始化Work = Available = (1, 6, 2, 3),Finish = (false, false, false, false, false)。
1.2 检查每个进程的Need是否小于等于Work,如果满足条件,更新Work和Finish。
1.3 重复步骤1.2,直到所有进程的Finish都为true或无法找到满足条件的进程。
步骤 2:检查进程P2的请求是否合法
2.1 检查Request[2]是否小于等于Need[2]。
2.2 检查Request[2]是否小于等于Available。
步骤 3:模拟资源分配并检查新状态是否安全
3.1 更新Available和Allocation。
3.2 重复步骤1.2,检查新状态是否安全。