银行家算法Word文档下载推荐.docx
《银行家算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行家算法Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
sstream>
string>
iomanip>
usingnamespacestd;
#defineM3
#defineN5
//m资源总量
staticintTotal[M]={10,5,7};
//m资源可分配量
staticintAvailable[M];
//进程n对m资源的最大需求量
staticintMax[N][M]=
{
{7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3}
};
//进程n已分配m资源量
staticintAllocation[N][M]=
{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}
//进程n还需m资源量
staticintNeed[N][M];
//进程的执行序号序列
staticintSecureSequence[N];
//系统可提供给进程继续运行所需的m资源量
staticintWork[M];
//系统是否有足够资源分配给进程n
staticboolFinish[N];
staticvoidsetAllUnfinished()
{
for(inti=0;
i<
N;
i++)
Finish[i]=false;
}
}
staticvoidinitializeSecureSequence()
SecureSequence[i]=-1;
staticvoidcountNeed()
for(intj=0;
j<
M;
j++)
{
Need[i][j]=Max[i][j]-Allocation[i][j];
}
staticvoidcountAvailable()
inttemp;
for(intj=0;
temp=0;
for(inti=0;
temp+=Allocation[i][j];
Available[j]=Total[j]-temp;
staticvoidaddSecureSequence(intn)
inti=0;
while(i<
N&
&
SecureSequence[i]!
=-1)
i++;
if(i<
N)
SecureSequence[i]=n;
stringto_string(inti)
stringstreamints;
stringtemps;
ints<
<
i;
ints>
>
temps;
//int转换为string
returntemps;
stringtemps;
intSecurityAlgorithm(intPi);
stringBankersAlgorithm(intPi,constint(&
Request)[M])
intj;
for(j=0;
j++)//将Pi请求资源分配给Pi,出错则提示并结束当前算法
if(Request[j]>
Need[Pi][j])
return"
出错!
请求资源量大于预计最大值!
"
;
Available[j])
尚无足够资源!
Available[j]-=Request[j];
Allocation[Pi][j]+=Request[j];
Need[Pi][j]-=Request[j];
if(SecurityAlgorithm(Pi)==1)
return"
进程"
+to_string(Pi)+"
请求资源成功!
elseif(SecurityAlgorithm(Pi)==0)
所有进程均已执行结束进程!
else//检查结果为不安全时回滚
for(j=0;
Available[j]+=Request[j];
Allocation[Pi][j]-=Request[j];
Need[Pi][j]+=Request[j];
若为进程"
分配资源,则系统处于不安全状态,令"
等待"
return"
unknownerrorfromBankersAlgorithm!
Pi="
+Pi;
intSecurityAlgorithm(intPi)//检查对Pi进程分配资源后是否还有完整安全序列
inti,j,tempi;
booltempb;
for(intk=0;
k<
k++)
Work[k]=Available[k];
tempi=0;
for(i=0;
tempb=false;
if(Finish[i]==false)
for(j=0;
{
if(Need[i][j]<
=Work[j])
{
tempb=true;
}
else
tempb=false;
break;
}
if(tempb==true)
//如果Pi进程分配资源后仍有安全进程,表明Pi可以执行完,返还Pi已分配资源并将Pi进程加入完成序列,返回1
for(intk=0;
Available[k]+=Allocation[Pi][k];
Finish[Pi]=true;
addSecureSequence(Pi);
return1;
else
tempi++;
if(tempi==N)//所有进程Finish==true
return0;
return-1;
voidoutput(intPi)//输出资源分配情况
inti,j;
cout<
setw(10)<
Max"
setw(15)<
Allocation"
Need"
Available"
endl;
4;
cout<
"
cout<
setw(3)<
char('
A'
+j);
endl<
P"
Pi<
Max[Pi][j];
Allocation[Pi][j];
Need[Pi][j];
Available[j];
voidoutputAll()
3;
Max[i][j];
Allocation[i][j];
Need[i][j];
intmain()
countAvailable();
countNeed();
initializeSecureSequence();
setAllUnfinished();
整体资源如下:
outputAll();
inti;
intPi;
intRequest[M];
\n\nAvailable:
+to_string(Available[i]);
\n\n请输入要分配资源的进程号:
cin>
Pi;
请输入进程对资源"
+to_string(i)+"
的需求数目:
cin>
Request[i];
\n尝试为进程"
分配资源"
output(Pi);
BankersAlgorithm(Pi,Request)<
SecureSequence[N-1]==-1&
N*N;
Pi=i%N;
if(Finish[Pi]==false)
output(Pi);
BankersAlgorithm(Pi,Need[Pi])<
\n存在安全序列"
->
+to_string(SecureSequence[i]);
\n程序即将退出,"
system("
pause"
);
return0;
四、程序运行结果
五、实验体会
通过本次实验,让我更加了解了银行家算法的过程。
即多个进程同时运行时,系统会根据各类系统资源的最大需求和各类系统剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,从而不至于发生死锁。
而银行家算法是避免死锁的主要方法,其思路在很多方面是值得我们大家所学习的。
上机实验是对我们课堂上理论知识的巩固和加深,当然只有上课认真听讲,弄懂其算法,才能在实践的过程中加以应用。
上机练习还能提高我们的编程能力。