操作系统实验四银行家算法.docx
《操作系统实验四银行家算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验四银行家算法.docx(10页珍藏版)》请在冰点文库上搜索。
操作系统实验四银行家算法
操作系统实验
实验四银行家算法
学号1215108019
姓名李克帆
班级12电子2班
华侨大学电子工程系
实验目的
1、理解银行家算法。
2、掌握进程安全性检查的方法与资源分配的方法。
实验内容与基本要求
编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
进程
已占资源
最大需求数
A
B
C
D
A
B
C
D
P0
0
0
1
2
0
0
1
2
P1
1
0
0
0
1
7
5
0
P2
1
3
5
4
2
3
5
6
P3
0
6
3
2
0
6
5
2
P4
0
0
1
4
0
6
5
6
现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答:
1、现在系统是否处于安全状态?
2、如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?
实验报告内容
1、银行家算法和安全性检查算法原理。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2、程序流程图。
3、程序及注释。
#include
#include
#defineM4//资源的种类数
#defineN5//进程的个数
voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);//统一的输出格式
boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);
boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);
voidmain()
{
inti,j;
//当前可用每类资源的资源数
intiAvailable[M]={1,5,2,0};
//系统中N个进程中的每一个进程对M类资源的最大需求
intiMax[N][M]={{0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};
//iNeed[N][M]每一个进程尚需的各类资源数
//iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数
intiNeed[N][M],iAllocation[N][M]={{0,0,1,2},{1,0,0,0},{1,3,5,4},{0,6,3,2},{0,0,1,4}};
//进程名
charcName[N]={'a','b','c','d','e'};
boolbExitFlag=true;//退出标记
charch;//接收选择是否继续提出申请时传进来的值
boolbSafe;//存放安全与否的标志
//计算iNeed[N][M]的值
for(i=0;ifor(j=0;jiNeed[i][j]=iMax[i][j]-iAllocation[i][j];
//输出初始值
output(iMax,iAllocation,iNeed,iAvailable,cName);
//判断当前状态是否安全
bSafe=safety(iAllocation,iNeed,iAvailable,cName);
//是否继续提出申请
while(bExitFlag)
{
cout<<"\n"<<"继续提出申请?
\ny为是;n为否。
\n";
cin>>ch;
switch(ch)
{
case'y':
//cout<<"调用银行家算法";
bSafe=banker(iAllocation,iNeed,iAvailable,cName);
if(bSafe)//安全,则输出变化后的数据
output(iMax,iAllocation,iNeed,iAvailable,cName);
break;
case'n':
cout<<"退出。
\n";
bExitFlag=false;
break;
default:
cout<<"输入有误,请重新输入:
\n";
}
}
}
//输出
voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N])
{
inti,j;
cout<<"\n\tMax\tAllocation\tNeed\tAvailable"<cout<<"\tABCD\tABCD\tABCD\tABCD"<for(i=0;i{
cout<for(j=0;jcout<cout<<"\t";
for(j=0;jcout<cout<<"\t";
for(j=0;jcout<cout<<"\t";
cout<<"";
//Available只需要输出一次
if(i==0)
for(j=0;jcout<cout<}
}
//安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示;
boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N])
{
inti,j,flag,x=0;
charnum[5];
intWork[M];
boolFinish[N];//定义基本变量
for(j=0;j<4;j++)
Work[j]=iAvailable[j];//将iAvailable的值赋给Work
for(i=0;i<5;i++)//将Finish全部置为False
Finish[i]=false;
while(true)//执行无限循环,满足条件时跳出
{
flag=0;//每次循环开始时将记录本次循环中是否有使有满足条件iAllocation的标志置为0,若为0表示不存在,若不为0表示存在
for(i=0;i<5;i++)//执行循环,看有没有满足条件的iAllocation
{
if(Finish[i]==false&&Work[0]>=iNeed[i][0]&&Work[1]>=iNeed[i][1]&&Work[2]>=iNeed[i][2])
{
for(j=0;j<4;j++)
{
Work[j]+=iAllocation[i][j];//Work[j]+=Work[j]+iAllocation[i][j]
}
Finish[i]=true;//将Finish置true
flag++;//标志加1
num[x++]=cName[i];//将该序列名赋给数组num[]
}
}
if(flag==0)
{
cout<<"无安全序列";//标志为0,证明已无满足条件iAllocation,退出循环,返回false
returnfalse;
}
if(Finish[0]==true&&Finish[1]==true&&Finish[2]==true&&Finish[3]==true&&Finish[4]==true)//若所有Finish置为true,输出安全数列,返回True
{
cout<<"\n";
cout<<"安全序列为:
";
for(x=0;x<5;x++)
cout<cout<<"\n";
returntrue;
}
}
returntrue;
}
//安全返回true,不安全返回false
boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N])
{
intiMax[N][M]={{0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};
intt,i,Request[4],check_1[4];
charx;//定义变量
cout<<"请输入进程名:
";//输入进程名
cin>>x;
if(x=='a')i=0;
if(x=='b')i=1;
if(x=='c')i=2;
if(x=='d')i=3;
if(x=='e')i=4;
cout<<"请输入各资源数量:
";//输入变量名
for(t=0;t<4;t++)
cin>>Request[t];
for(t=0;t<4;t++)//检查数值
{
check_1[t]=Request[t]+iAllocation[i][t];
}
for(t=0;t<4;t++)
{
if((iMax[i][t]-check_1[t])<0)
{
cout<<"\n资源申请超过最大需求量!
!
!
\n";
returnfalse;
}
}
for(t=0;t<4;t++)//检查数值
{
if((iAvailable[t]-Request[t])<0)
{
cout<<"\n不能满足进程!
!
!
\n";
returnfalse;
}
}
for(t=0;t<4;t++)//将该变量的iAvailable、iAllocation、iNeed重新赋值
{
iAvailable[t]-=Request[t];
iAllocation[i][t]+=Request[t];
iNeed[i][t]-=Request[t];
}
safety(iAllocation,iNeed,iAvailable,cName);//执行安全数列算法
returntrue;
returntrue;
}
4、运行结果以及结论。