操作系统实验二银行家算法实验报告.docx
《操作系统实验二银行家算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验二银行家算法实验报告.docx(14页珍藏版)》请在冰点文库上搜索。
操作系统实验二银行家算法实验报告
实验二实验报告
实验源码:
#include"stdio.h"
#include
#include
#defineFalse0//定义False
#defineTrue1//定义True
intMax[100][100]={0};//各进程所需各类资源的最大需求
intAvaliable[100]={0};//系统可用资源
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;
printf("\n此时刻的资源分配情况为:
\n");
//显示表头
printf("MaxAllocationNeedAvaliable\n");
printf("PCB");
//显示作业名称
for(j=0;j<4;j++){
for(i=0;iprintf("%c",name[i]);
printf("");
}
printf("\n");
//显示当前作业资源分配情况
for(i=0;iprintf("%d",i);
for(j=0;jprintf("%d",Max[i][j]);
printf("");
for(j=0;jprintf("%d",Allocation[i][j]);
printf("");
for(j=0;jprintf("%d",Need[i][j]);
if(i==0){
printf("");
for(j=0;jprintf("%d",Avaliable[j]);
}
printf("\n");
}
}
//进行资源分配
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,d,k=0,m,h,s,apply,Finish[100]={0};
intj;
intflag=0;
for(i=0;iWork[i]=Avaliable[i];
printf("安全性检查\n");
printf("WorkNeedAllocationWork+AllocationFinish\n");
printf("PCB");
//显示作业名称
for(j=0;j<4;j++){
for(i=0;iprintf("%c",name[i]);
printf("");
}
printf("\n");
//显示当前作业资源分配情况
for(i=0;iapply=0;
for(j=0;jif(Finish[i]==False&&Need[i][j]<=Work[j])
{
apply++;
if(apply==N)
{
printf("%d",i);
for(d=0;dprintf("%d",Work[d]);
printf("");
for(d=0;dprintf("%d",Need[i][d]);
printf("");
for(d=0;dprintf("%d",Allocation[i][d]);
printf("");
for(m=0;m{
Work[m]=Work[m]+Allocation[i][m];
printf("%d",Work[m]);
}//变分配数
Finish[i]=True;
temp[k]=i;
printf("");
printf("true");
printf("\n");
i=-1;
k++;
flag++;
}
}
}
}
for(i=0;iif(Finish[i]==False){
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];
}
printf("\n系统进入不安全状态!
此时系统不分配资源!
\n");//不成功系统不安全
return0;
}
}
printf("\n此时系统是安全的!
\n");//如果安全,输出成功
printf("安全序列为:
");
for(i=0;i{
printf("%d",temp[i]);
if(iprintf("->");
}
printf("\n");
return0;
}
//利用银行家算法对申请资源对进行判定
voidshare()
{
charch;
inti=0,j=0;
ch='y';
printf("\n请输入要求分配的资源进程号(0-%d):
",M-1);
scanf("%d",&i);//输入须申请的资源号
printf("\n请输入进程%d申请的资源:
\n",i);
for(j=0;j{
printf("%c:
",name[j]);
scanf("%d",&Request[j]);//输入需要申请的资源
}
for(j=0;jif(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错
{
printf("\n进程%d申请的资源大于它需要的资源",i);
printf("分配不合理,不予分配!
\n");
ch='n';
break;
}else{
if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则
{//出错
printf("\n进程%d申请的资源大于系统现在可利用的资源",i);
printf("分配出错,不予分配!
\n");
ch='n';
break;
}
}
}
if(ch=='y'){
changdata(i);//根据进程需求量变换资源
showdata();//根据进程需求量显示变换后的资源
safe();//根据进程需求量进行银行家算法判断
}
}
//主函数
intmain()
{
intt=1,i,j,number,choice,m,n,flag;
charming;
printf("\n请首先输入系统可供资源种类的数量:
");
scanf("%d",&n);
N=n;
for(i=0;i{
printf("资源%d的名称:
",i+1);
scanf("%s",&ming);
name[i]=ming;
printf("资源的数量:
");
scanf("%d",&number);
Avaliable[i]=number;
}
printf("\n");
printf("请输入作业的数量:
");
scanf("%d",&m);
M=m;
printf("\n请输入各进程的最大需求量(%d*%d矩阵)[Max]:
\n",m,n);
for(i=0;ifor(j=0;jscanf("%d",&Max[i][j]);
do{
flag=0;
printf("\n请输入各进程已经申请的资源量(%d*%d矩阵)[Allocation]:
\n",m,n);
for(i=0;ifor(j=0;jscanf("%d",&Allocation[i][j]);
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
printf("\n申请的资源大于最大需求量,请重新输入!
\n\n");
}while(flag);
showdata();//显示各种资源
safe();//用银行家算法判定系统是否安全
while
(1){
if(t==1){
printf("\n利用银行家算法预分配资源\n");
share();
t=0;
}
elsebreak;
printf("\n是否继续银行家算法?
(按1键继续,按其它任意键退出):
");
scanf("%d",&t);
printf("\n");
}
return1;
}
实验结果截图:
运行程序:
输入相应数据并完成首次自检:
进程1请求资源Request(1,0,2):
进程4请求资源Request(3,3,0):
进程0请求资源Request(0,2,0):