银行家算法 C语言实现.docx
《银行家算法 C语言实现.docx》由会员分享,可在线阅读,更多相关《银行家算法 C语言实现.docx(14页珍藏版)》请在冰点文库上搜索。
银行家算法C语言实现
《操作系统原理》
上机作业(报告)
作业:
银行家算法
班级:
姓名:
学号:
时间:
题目
银行家算法模拟
作业要求
【题目要求】编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
系统某一时刻T0中A、B、C3类资源分别还剩3、3、2个,请按银行家算法回答:
一、T0系统是否处于安全状态?
请打印输出找到的资源分配的安全序列。
二、如果T0时刻进程P1提出需要(1、0、2)个资源的请求,系统能否满足它的请求?
如果T0时刻进程P4提出需要(3、3、0)个资源的请求,系统能否满足它的请求?
如果T0时刻进程P0提出需要(0、2、0)个资源的请求,系统能否满足它的请求?
【实验要求】可选编程语言:
C/C++/Java/C#/Python;
实现在同一个程序文件中(C/C++);
请适当注释;
报告正文(运行屏幕截图及源代码)
1.
T0时刻系统安全
2.
P1可以完成需求
3.
P4不能完成需求
4.
P0可以完成需求
源代码:
#include
#defineresNum3
#defineproNum5
intavailable[resNum];//当前系统可用(剩余)资源
intmaxRequest[proNum][resNum]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//进程的最大需求资源
intallocation[proNum][resNum]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//进程已经分配的资源
intneed[proNum][resNum]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//进程还需要的资源
boolFinish[proNum];//是否安全(是否进程完成),完成true,未完成false
intsafeArray[proNum];//安全序列
intrequest[resNum];//进程请求资源量
intnum;//资源数量计数
voidinitSafeArray()//安全序列初始化
{
inti=0;
for(i=0;i{
safeArray[i]=0;
}
}
voidprintSystemMessage()//打印当前系统信息
{
inti,j;
printf("\n------------------------------------------------------------------------------------\n");
printf("当前系统各类资源剩余:
");
for(i=0;i{
printf("%d",available[i]);
}
printf("\n当前系统资源情况:
\n");
printf("PID\tMax\t\t\tAllocation\t\tNeed\n");
for(i=0;i{
printf("P%d\t",i);
for(j=0;j{
printf("%3d",maxRequest[i][j]);
}
printf("\t\t");
for(j=0;j{
printf("%3d",allocation[i][j]);
}
printf("\t\t");
for(j=0;j{
printf("%3d",need[i][j]);
}
printf("\n");
}
}
voidprintSafeMessage(int*work,intn)//打印安全检查信息
{
inti;
printf("P%d\t",n);
for(i=0;i{
printf("%3d",work[i]);
}
printf("\t\t");
for(i=0;i{
printf("%3d",allocation[n][i]);
}
printf("\t\t");
for(i=0;i{
printf("%3d",need[n][i]);
}
printf("\t\t");
for(i=0;i{
printf("%3d",allocation[n][i]+work[i]);
}
printf("\n");
}
boolisFinish(intn)//判断进程n的需求资源是否全为零
{
inti;
num=0;
for(i=0;i{
if(need[n][i]==0)
{
num++;
}
}
if(num==resNum)
{
returntrue;
}
else
{
returnfalse;
}
}
//安全检查
boolisSafe()
{
inti;
intsafeArrayIndex=0;
intallFinish=0;
intwork[resNum];
intn=0;
inttemp=0;
intpNum=0;
boolflag=false;
for(i=0;i{
work[i]=0;
}
for(i=0;i{
work[i]=available[i];
}
for(i=0;i{
flag=isFinish(i);
if(flag==true)
{
Finish[i]=true;
allFinish++;
}
else
{
Finish[i]=false;
}
}
while(allFinish!
=proNum)//预分配开始
{
num=0;
for(i=0;i{
if(need[n][i]<=work[i]&&Finish[n]==false)
{
num++;
}
}
if(num==resNum)
{
for(i=0;i{
work[i]=work[i]+allocation[n][i];
}
allFinish++;
printSafeMessage(work,n);
safeArray[safeArrayIndex]=n;
safeArrayIndex++;
Finish[n]=true;
}
n++;
if(n>=proNum)
{
n=n%proNum;
if(temp==allFinish)
{
break;
}
temp=allFinish;
}
pNum=allFinish;
}
for(i=0;i{
if(Finish[i]==false)
{
printf("\n当前系统不安全!
\n\n");
returnfalse;
}
}
printf("\n当前系统安全!
\n安全序列为:
");
for(i=0;i{
flag=isFinish(i);
if(flag==true)
{
pNum--;
}
}
for(i=0;i{
printf("%d",safeArray[i]);
}
returntrue;
}
//主函数
intmain()
{
intcurProcess=0;
inta=-1,i,j;
printf("系统有1、2、3三种资源,请输入当前系统各类资源剩余:
");
for(i=0;i{
scanf("%d",&available[i]);
}
printSystemMessage();
printf("\n系统安全情况分析\n");
printf("PID\tWork\t\t\tAllocation\t\tNeed\t\t\tWork+Allocation\n");
boolisStart=isSafe();
while(isStart)//用户输入或者预设系统资源分配合理才能继续运行
{
//限制用户输入,以防用户输入大于进程数量的数字,以及输入其他字符
do
{
if(curProcess>=proNum||a==0)
{
printf("\n请不要输入超出进程数量的值或者其他字符:
\n");
while(getchar()!
='\n'){};
a=-1;
}
printf("\n------------------------------------------------------------------------------------\n");
printf("\n输入要分配的进程:
");
a=scanf("%d",&curProcess);
printf("\n");
}while(curProcess>=proNum||a==0);
//限制用户输入,此处只接受数字,以防用户输入其他字符(乱输是不允许的)
for(i=0;i{
do
{
if(a==0)
{
printf("\n请不要输入除数字以外的其他字符,请重新输入:
\n");
while(getchar()!
='\n'){};//清空缓冲区
a=-1;
}
printf("请输入要分配给进程P%d的第%d类资源:
",curProcess,i+1);
a=scanf("%d",&request[i]);
}while(a==0);
}
//判断用户输入的分配是否合理,如果合理,开始进行预分配
num=0;
for(i=0;i{
if(request[i]<=need[curProcess][i]&&request[i]<=available[i])
{
num++;
}
else
{
printf("\n发生错误!
可能原因如下:
\n
(1)请求分配的资源可能大于该进程的某些资源的最大需求量\n
(2)系统所剩的资源不足\n");
break;
}
}
if(num==resNum)
{
num=0;
for(j=0;j{
available[j]=available[j]-request[j];
allocation[curProcess][j]=allocation[curProcess][j]+request[j];
need[curProcess][j]=need[curProcess][j]-request[j];
if(need[curProcess][j]==0)
{
num++;
}
}
//如果分配以后该进程完成,则释放该进程占用资源
if(num==resNum)//释放已完成资源
{
for(i=0;i{
available[i]=available[i]+allocation[curProcess][i];
}
printf("\n本次分配进程P%d完成,该进程占用资源全部释放完毕\n",curProcess);
}
else
{
//资源分配可以不用一次性满足进程需求
printf("\n本次分配进程P%d未完成\n",curProcess);
}
printSystemMessage();
printf("\n系统安全情况分析\n");
printf("PID\tWork\t\t\tAllocation\t\tNeed\t\t\tWork+Allocation\n");
//预分配完成以后,判断该系统是否安全,若安全,则可继续进行分配,若不安全,将已经分配的资源换回来
if(!
isSafe())
{
for(j=0;j{
available[j]=available[j]+request[j];
allocation[curProcess][j]=allocation[curProcess][j]-request[j];
need[curProcess][j]=need[curProcess][j]+request[j];
}
printf("资源不足,分配失败!
\n");
}
}
}
return0;
}