📄 yinhangjia.cpp
字号:
#include<stdio.h>
//全局变量
int max[5][10],allocation[5][10],need[5][10],available[10];//定义变量
int request[5][10];//进程需求
int k=5;//序列临时变量
int jincheng=0;//当前进程
//初始化数据
int available0[10]={3,8,5,6,3,4,5,4,3,8};//可用资源
int anquanxulie[5]={1,4,3,0,2};
int max0[5][10]={
{7,5,3,2,3,1,4,6,7,3},
{3,2,2,2,3,4,5,6,1,6},
{9,0,2,4,0,4,8,2,4,7},
{2,2,2,3,6,7,2,4,2,5},
{4,3,3,4,7,3,7,2,4,6}
};//最大需求
int allocation0[5][10]={
{0,1,0,1,2,1,0,2,3,0},
{2,0,0,2,2,0,1,2,0,1},
{3,0,2,1,0,2,2,0,2,1},
{2,1,1,0,2,0,0,1,0,0},
{0,0,2,0,1,3,2,1,2,0}
};//已分配
int need0[5][10]={
{7,4,3,1,4,0,4,4,4,3},
{1,2,2,0,3,4,1,4,1,5},
{6,0,0,3,2,4,1,2,2,6},
{0,1,1,3,2,7,3,3,2,5},
{4,3,1,4,4,0,1,1,2,6}
};//需求
int check()//安全算法
{
int work[10];
int finish[5];
int i,j,n;
for(j=0;j<10;j++)
work[j]=available[j];
for(i=0;i<5;i++)
finish[i]=0;
k=0;
loop:
for(i=0;i<5;i++)
if(finish[i]==0)
{
n=1;
for(j=0;j<10;j++)
if(need[i][j]>work[j])
{n=0;break;}
if(!n)
continue;
else
{
for(j=0;j<10;j++)
work[j]+=allocation[i][j];
finish[i]=1;
n=0;
for(j=0;j<10;j++)
n+=need[i][j];
if(n)
anquanxulie[k++]=i;
goto loop;
}
}
for(j=0;j<5;j++)
if(finish[j]==0){printf("\n不安全需求\n");
return 0;}
return 1;
}
void yinhangjia()//银行家算法
{
int allocation1[10],available1[10],need1[10];
int n;
int j;
int k1=k;
for(j=0;j<10;j++)//写入临时变量
{
available1[j]=available[j];
allocation1[j]=allocation[jincheng][j];
need1[j]=need[jincheng][j];
}
for(j=0;j<10;j++)
{
available[j]-=request[jincheng][j];
need[jincheng][j]-=request[jincheng][j];
allocation[jincheng][j]+=request[jincheng][j];
}
if(check())//判断是否安全
{
n=0;
for(j=0;j<10;j++)
n+=need[jincheng][j];
if(!n)
for(j=0;j<10;j++)
{
available[j]+=allocation[jincheng][j];//如果安全则释放资源
allocation[jincheng][j]=0;
max[jincheng][j]=0;
}
}
else
{
k=k1;
for(j=0;j<10;j++)//否则写回全局变量
{
allocation[jincheng][j]=allocation1[j];
need[jincheng][j]=need1[j];
available[j]=available1[j];
}
}
}
void main()//主函数
{
int i,j,a,b,c,n;
for(i=0;i<5;i++)
for(j=0;j<10;j++)
max[i][j]=max0[i][j];
for(i=0;i<5;i++)
for(j=0;j<10;j++)
allocation[i][j]=allocation0[i][j];
for(i=0;i<5;i++)
for(j=0;j<10;j++)
need[i][j]=need0[i][j];
for(j=0;j<10;j++)
available[j]=available0[j];//写入基本数值
do{
do{
a=0;b=0;
printf("\n安全序列:\n");
for(i=0;i<k;i++)
{
printf("p%d ",anquanxulie[i]);
}
printf("\n");
printf("\n 已分配资源 最大需求资源 需求资源\n");
for(i=0;i<5;i++)
{
printf("p%d ",i);
printf(" ");
for(j=0;j<10;j++)
printf("%2d",allocation[i][j]);
printf(" ");
for(j=0;j<10;j++)
printf("%2d",max[i][j]);
printf(" ");
for(j=0;j<10;j++)
printf("%2d",need[i][j]);
printf(" \n");
}
printf("可利用资源:");
for(j=0;j<10;j++)
printf("%3d",available[j]);//以上为页面输出
printf("\n输入请求进程号:\n");
scanf("%d",&jincheng);
if (jincheng<0 ||jincheng>=5)
{printf("\n\n没当前进程\n\n");//判断有否此进程
b=1;
continue;}
n=0;
for(j=0;j<10;j++)n+=need[jincheng][j];
if (!n) {
printf("\n\np%d进程处于完成状态\n\n",jincheng);//判断进程是否处于完成态
a=1;
continue;
}
printf("p%d进程对各资源的需求:\n",jincheng);
for(j=0;j<10;j++)
scanf("%d",&request[jincheng][j]);
printf("\n");
for(j=0;j<10;j++){
if(request[jincheng][j]>need[jincheng][j])
{
printf("\n\n进程所请求的资源超过其需求资源!\n\n");//判断是否超过其需求资源并标记
a=1;
break;
}
}
for(j=0;j<10;j++){
if(request[jincheng][j]>available[j])
{
printf("\n\n进程所请求的资源超过可利用资源!\n\n");//判断是否超过可利用资源并标记
b=1;
break;
}
}
}while((a==1)||(b==1));
yinhangjia();
c=0;
for(i=0;i<5;i++)//判断进程是否全部完成
{
for(j=0;j<10;j++)
{
if(need[i][j]!=0)
c=1;
}
}
}while(c);
printf("\n进程全部完成\n\n银行家算法 the end \n\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -