📄 4.txt
字号:
#include<string.h>
#include<stdio.h>
#define M 5 //定义进程数
#define N 3 //定义资源数
#define False 0
#define True 1
char saf='t';
int Max[][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Avaliable[]={3,3,2}; //系统可用资源
int Allocation[][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//系统已分配资源
int Need[][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//还需要资源
int Request[3];
void showdata()//显示资源矩阵
{
int i,j;
printf("系统可用的资源:\n");
printf("resouce:");
for (j=0;j<N;j++)
printf("%d,",Avaliable[j]);//输出分配资源
printf("\n");
printf("各进程的资源需求:\n");
for (i=0;i<M;i++)
{
printf("pr%d: ",i);
for (j=0;j<N;j++)
{
printf("%d,",Max[i][j]);//输出最大需求资源数
}
printf("\n");
}
printf("各进程得到资源:\n");
for (i=0;i<M;i++)
{
printf("pr%d: ",i);
for(j=0;j<N;j++)
printf("%d,",Allocation[i][j]);//输出已分配资源数
printf("\n");
}
printf("各进程还需求资源:\n");
for (i=0;i<M;i++)
{
printf("pr%d: ",i);
for(j=0;j<N;j++)
printf("%d,",Need[i][j]);//输出还需要资源数
printf("\n");
}
}
int shifang(int i)//释放资源
{
int j;
for (j=0;j<N;j++)
{
Avaliable[j]=Avaliable[j]+Request[j];
Allocation[i][j]=Allocation[i][j]-Request[j];
Need[i][j]=Need[i][j]+Request[j];
}
return 1;
}
int changdata(int i)//进行资源分配
{
int j;
for (j=0;j<M;j++)
{
Avaliable[j]=Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
}
return 1;
}
int safe()//安全性算法
{
int Work[3],Finish[M]={0},temp[M];
int i,k=0,m,apply;
int j;
for(i=0;i<3;i++)
{
Work[i]=Avaliable[i];
}
for(i=0;i<M;i++)
{
apply=0;
for(j=0;j<3;j++)
{
if (Finish[i]==False&&Need[i][j]<=Work[j])
{
apply++;
if(apply==3)
{
for(m=0;m<3;m++)
Work[m]=Work[m]+Allocation[i][m];//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
}
}
else
if(Finish[i]==False)
{
if(i==M-1)
{
printf("系统不安全\n");//如果不成功,输出系统不安全
saf='f';
return saf;
}
break;
}
}
}
printf("系统资源分配成功!");//如果安全,输出成功
printf("分配的序列:\n");
for(i=0;i<M;i++)//输出运行进程数组
{
printf("pr%d ",temp[i]);
}
return 0;
}
void share()//利用银行家算法对申请资源对进行判定
{
char ch;
int i=0,j=0;
ch='y';
char saf='t';
printf("\n请输入要求分配的资源进程号从(0 to 4):");
scanf("%d",&i);//输入须申请的资源号
printf("请输入进程 %d 申请的资源:\n",i);
for(j=0;j<3;j++)
{
printf("第 %d 个资源:",j+1);
scanf("%d",&Request[j]);//输入需要申请的资源
}
for (j=0;j<N;j++)
{
if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错
{
printf("进程 %d 申请的资源大于它需要的资源",i);
printf(" error!\n");
ch='n';
break;
}
else
{
if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则
{ //出错
printf("进程 %d 申请的资源大于available",i);
printf(" error!\n");
ch='n';
break;
}
}
}
if(ch=='y')//利用银行家算法
{
changdata(i);//根据进程需求量变换资源
showdata();//根据进程需求量显示变换后的资源
safe();//根据进程需求量进行安全算法判断
if(saf=='f')
{
shifang(i);
}
}
}
void Revision()
{
printf("请选择: 1:修改进程还需要的资源 2:修改进程可用资源");
int choice1;
scanf("%d",&choice1);
if(choice1==1)
{
printf("输入要修改的资源号(0~4)");
int p;
scanf("%d",&p);
printf("输入修改后进程还需要的资源(1,1,1)\n");
scanf("%d,%d,%d",&Need[p][0],&Need[p][1],&Need[p][2]);
printf("经修改后各进程还需求资源:\n");
for (int a=0;a<M;a++)
{
printf("pr%d:",a);
for(int b=0;b<N;b++)
printf("%d, ",Need[a][b]);//输出还需要资源数
printf("\n");
}
}
if(choice1==2)
{
printf("输入系统可用资源EX(1,1,1)\n");
scanf("%d,%d,%d",&Avaliable[0],&Avaliable[1],&Avaliable[2]);
printf("经修改后的系统可用资源为\n");
for (int k=0;k<N;k++)
printf("%d,",Avaliable[k]);
}
}
int main()//主函数
{
int choice;
showdata();//显示各种资源
safe();//用银行家算法判定系统是否安全
do{
printf("\n*****输入要进行的操作 1:分配资源 2: 修改资源 3:显示资源 4:离开*****");
scanf("%d",&choice);
if(choice==1)
{
share();
}
if(choice==2)
{
Revision();
}
if(choice==3)
{
showdata();
}
if(choice==4)
break;
}while((choice==1)||(choice==2)||(choice==3));
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -