银行家算法及安全算法.docx
《银行家算法及安全算法.docx》由会员分享,可在线阅读,更多相关《银行家算法及安全算法.docx(10页珍藏版)》请在冰豆网上搜索。
银行家算法及安全算法
银行家算法及安全算法
实验名称:
银行家算法
实验时间:
2015.04.20
实验目的:
1:
利用银行家算法避免死锁
2:
掌握银行家算法的基本原理
3:
掌握安全算法的基本原理
实验仪器:
PCvc6.0
实验原理:
1:
银行家算法的基本原理
■宦行家算法;进程Pj发出资源请求Requests
■安全性算法
Work:
-Available;
Finish[i…“ii);
刁—
我一满足下刘条件的进穩t
Fnish[i]=tru£?
rinhh[i]^fabc且Ncc(lL<\Votk找叭—
Work:
=Work+AllocatioHj;
Finish[i]|:
=true;
实验内容:
请使用银行家算法来避免死锁的产生程序代码:
(供参考)
#include#includevstring.h>
#include
#defineFalse0#defineTrue1
intMax[100][100]={0};〃各进程所需各类资源的最大需求intAvaliable[1OO]={O};〃系统可用资源
charname[100]={0};〃资源的名称
intAllocation[100][100]={0};〃系统已分配资源
intNeed[100][100]={0};〃还需要资源
intRequest[100]={0};〃请求资源向量
inttemp[100]={0};〃存放安全序列
intWork[100]={0};〃存放系统可提供资源
intM=100;〃作业的最大数为100
intN=100;〃资源的最大数为100
voidshowdata()〃显示资源矩阵
{
inti,j;
cout«"系统目前可用的资源[Avaliable]:
"«endl;
for(i=0;icout<cout«endl;
for(j=0;jcout<cout«endl;
Need"«endl;
cout«"MaxAllocation
coutvv"进程名";
for(j=0;j<3;j++){
for(i=0;icoutvcout«"";
}
cout«endl;
for(i=0;icoutvv""vvivv"";
for(j=0;jcout«Max[曲]<<"";
coutvv"";
for(j=0;jcoutvvAllocation[i][j]<<"";
coutvv"";
for(j=0;jcout<coutvvendl;
}
}
intchangdata(inti)//进行资源分配
{
intj;
for(j=0;jAvaliable[j]二Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
}
return1;
}
intsafe()〃安全性算法
{
inti,k=O,m,apply,Finish[100]={0};
intj;
intflag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;iapply=0;
for(j=0;jif(Finish[i]==False&&Need[i][j]<=Work[j]){apply++;
if(apply==N){
for(m=0;mFinish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
}
}
}
}
for(i=0;iif(Finish[i]==False){
coutvv"系统不安全"<return-1;
}
}
coutvv"系统是安全的!
"<coutvv"分配的序列:
";
for(i=0;icout<if(i";
return0;
}
voidshare()〃利用银行家算法对申请资源对进行判定
{
charch;
inti=0,j=0;
ch='y';
coutvv"请输入要求分配的资源进程号(0-"vvM-1vv"):
";
cin>>i;〃输入须申请的资源号
coutvv"请输入进程"vvivv"申请的资源:
"<for(j=0;j{
cout<";
cin»Request[j];〃输入需要申请的资源
}
若大于则出
for(j=0;jif(Request[j]>Need[i][j])〃判断申请是否大于需求,
错
{
coutvv"进程"vvivv"申请的资源大于它需要的资源ch='n';
break;
else{
if(Request[j]>Avaliable[j])〃判断申请是否大于当前资
源,若大于则
{//出错
coutvv"进程"vvivv"申请的资源大于系统现在可利用的资源
coutvv"分配出错,不予分配!
"<ch='n:
break;
}
}
}
if(ch=='y'){
changdata(i);//根据进程需求量变换资源
showdata();〃根据进程需求量显示变换后的资源
safe();//根据进程需求量进行银行家算法判断
}
}
voidaddresources(){//添加资源
intn,flag;
cin>>n;
flag二N;
N=N+n;
for(inti=0;icoutvv"名称:
";
cin>>name[flag];
coutvv"数量:
";
cin>>Avaliable[flag++];
}
showdata();
safe();
}
voiddelresources(){〃删除资源
charming;
inti,flag=1;
coutvv"请输入需要删除的资源名称:
do{
cin>>ming;
for(i=0;iif(ming==name[i]){
flag=0;
break;
if(i==N)
coutvv"该资源名称不存在,请重新输入:
”
}
while(flag);
for(intj=i;j{
name[j]二name[j+1];
Avaliable[j]=Avaliable[j+1];
}
N=N-1;
showdata();
safe();
}
voidchangeresources(){〃修改资源函数
coutvv"系统目前可用的资源[Avaliable]:
"«endl;
for(inti=0;icout<"v"<>Avaliable[0]>>Avaliable[1]>>Avaliable[2];coutvv"经修改后的系统可用资源为"<for(intk=0;kcoutv"vshowdata();
safe();
}
voidaddprocess(){〃添加作业
intflag二M;
M=M+1;
coutvv"请输入该作业的最打需求量[Max]"«endl;
for(inti=0;icout<";
cin>>Max[flag][i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
}
showdata();
safe();
}
intmain()〃主函数
{
inti,j,number,choice,m,n,flag;
charming;
*****************"
<coutvv"请首先输入系统可供资源种类的数量cin>>n;
N=n;
for(i=0;i{
coutvv"资源"<
";
cin>>ming;
name[i]=ming;
coutvv"资源的数量:
";
cin>>number;
Avaliable[i]=number;
}
cout<coutvv"请输入作业的数量:
"cin>>m;
vvnvv"矩
M=m;
coutvv"请输入各进程的最大需求量("vvmvv"
阵)[Max]:
"vvendl;
for(i=0;ivm;i++)
for(j=0;jvn;j++)
do{
flag=O;
coutvv"请输入各进程已经申请的资源量("vvmvv"*"vvn<<"矩阵)[Allocation]:
"<for(i=0;ifor(j=0;jcin>>Allocation[i][j];
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
coutvv"申请的资源大于最大需求量,请重新输入!
\n";
}
while(flag);
showdata();〃显示各种资源
safe();〃用银行家算法判定系统是否安全
while(choice)
{
coutvv"**************银行家算法演示
***************"
coutvv"
1:
增加资源
"vvendl;
coutvv"
2:
删除资源
"vvendl;
coutvv"
3:
修改资源
"vvendl;
coutvv"
4:
分配资源
"vvendl;
coutvv"
5:
增加作业
"vvendl;
coutvv"
0:
离开
"vvendl;
coutcoutvv"请选择功能号:
";
cin>>choice;
switch(choice)
case1:
addresources();break;
case2:
delresources();break;
case3:
changeresources();break;