这个实验代码较为简单 不多说 直接上代码
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct
{
int A;
int B;
int C;
}Resource;
Resource Max[N]={{7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3}};
Resource Allo[N]={{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}};
Resource Need[N]={{7,4,3},
{1,2,2},
{6,0,0},
{0,1,1},
{4,3,1}};
Resource Available={3,3,2};
Resource Work[N]={0};
int Finish[N];//是否可以分配资源
int Safesequence[N]={0};//存入安全序列
void Initial(); //初始化
void Input();//输入
void PrintTable(); //输出资源分配表
int request(int process,Resource app);//请求资源
void tryDistribute(int process,Resource app);//试探分配
void Rollback(int process,Resource app);//安全检查失败,回滚
int Safecheck();//安全检查
int request(int process,Resource app);
void requestResult();
void printresult();
int main()
{
int flag;
while(1)
{
printf("\n\n\t银行家算法\n\n");
printf("\t1.初始化\n");
printf("\t2.查看当前资源分配表\n");
printf("\t3.请求资源\n");
printf("\t4.退出\n\n\n");
printf("\t请输入选择:");
scanf("%d",&flag);
switch(flag)
{
case 1 : Input(); break;
case 2 : PrintTable(); break;
case 3 : requestResult(); break;
case 4 : exit(0); break;
default : break;
}
}
return 0;
}
void Initial() //初始化
{
for (int i=0;i<N;i++)
{
Resource Max[N]={0};
Resource Allo[N]={0};
Resource Need[N]={0};
Resource Available={0};
}
}
void Input()
{
system("cls");
Initial();
for(int i=0;i<N;i++)
{
printf("输入进程P%d的资源分配情况(三类资源,空格隔开)\n",i);
printf("Max:");
scanf("%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);
printf("Alloction:");
scanf("%d%d%d",&Allo[i].A,&Allo[i].B,&Allo[i].C);
Need[i].A=Max[i].A-Allo[i].A;
Need[i].B=Max[i].A-Allo[i].B;
Need[i].C=Max[i].A-Allo[i].C;
}
printf("输入当前可用资源数量(三类资源,空格隔开)\n");
scanf("%d%d%d",&Available.A,&Available.B,&Available.C);
system("pause");
system("cls");
}
void PrintTable() //输出资源分配表
{
system("cls");
printf("\n\n");
printf("Process Max Allo Need Available\n");
printf(" A B C| A B C| A B C| A B C|\n");
printf(" P0 %d %d %-1d| %d %d %-1d| %d %d %-1d| %d %d %-1d|\n",Max[0].A,Max[0].B,Max[0].C,Allo[0].A,Allo[0].B,Allo[0].C,Need[0].A,Need[0].B,Need[0].C,Available.A,Available.B,Available.C);
printf(" P1 %d %d %-1d| %d %d %-1d| %d %d %-1d|\n",Max[1].A,Max[1].B,Max[1].C,Allo[1].A,Allo[1].B,Allo[1].C,Need[1].A,Need[1].B,Need[1].C);
printf(" P2 %d %d %-1d| %d %d %-1d| %d %d %-1d|\n",Max[2].A,Max[2].B,Max[2].C,Allo[2].A,Allo[2].B,Allo[2].C,Need[2].A,Need[2].B,Need[2].C);
printf(" P3 %d %d %-1d| %d %d %-1d| %d %d %-1d|\n",Max[3].A,Max[3].B,Max[3].C,Allo[3].A,Allo[3].B,Allo[3].C,Need[3].A,Need[3].B,Need[3].C);
printf(" P4 %d %d %-1d| %d %d %-1d| %d %d %-1d|\n",Max[4].A,Max[4].B,Max[4].C,Allo[4].A,Allo[4].B,Allo[4].C,Need[4].A,Need[4].B,Need[4].C);
printf("\n");
system("pause");
system("cls");
}
//试探分配
void tryDistribute(int process,Resource res)
{
Available.A=Available.A-res.A;
Available.B=Available.B-res.B;
Available.C=Available.C-res.C;
Allo[process].A=Allo[process].A+res.A;
Allo[process].B=Allo[process].B+res.B;
Allo[process].C=Allo[process].C+res.C;
Need[process].A=Need[process].A-res.A;
Need[process].B=Need[process].B-res.B;
Need[process].C=Need[process].C-res.C;
}
//不满足分配条件 再加回去
void Rollback(int process,Resource res)
{
Available.A=Available.A+res.A;
Available.B=Available.B+res.B;
Available.C=Available.C+res.C;
Allo[process].A=Allo[process].A-res.A;
Allo[process].B=Allo[process].B-res.B;
Allo[process].C=Allo[process].C-res.C;
Need[process].A=Need[process].A+res.A;
Need[process].B=Need[process].B+res.B;
Need[process].C=Need[process].C+res.C;
}
int Safecheck()
{
int s=0; //存储Work[]
Work[s]=Available;
int j=0; //存储安全序列
int n=0;
for(int i=0;i<N;i++)//重置finish
{
Finish[i]=0;
}
while(n<5)
{
for(int i=0;i<N;i++)
{
if(Finish[i]==0)
{
if(Need[i].A<=Work[s].A&&Need[i].B<=Work[s].B&&Need[i].C<=Work[s].C)
{
int m=s+1;
Work[m].A=Work[s].A+Allo[i].A;
Work[m].B=Work[s].B+Allo[i].B;
Work[m].C=Work[s].C+Allo[i].C;
Finish[i]=1;
Safesequence[j++]=i;
s=m;
}
}
}
n++;
}
//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态
for ( int i=0;i<N;i++)
{
if (Finish[i]==0)
{
return 0;
}
else
{
Finish[i]=1;
}
}
return 1;
}
//资源分配请求
int request(int process,Resource res)
{
if(res.A<=Need[process].A&&res.B<=Need[process].B&&res.C<=Need[process].C)
{
if(res.A<=Available.A&&res.B<=Available.B&&res.C<=Available.C)
{
tryDistribute(process,res);
if(Safecheck()==1)
{
return 1;
}
else
{
printf("安全性检查失败。原因:系统将进入不安全状态,可能引起死锁。\n");
printf("正在回滚...\n");
Rollback(process,res);
}
}
else
{
printf("原因:请求向量大于可利用资源向量。P%d请等待\n",process);
}
}
else
{
printf("安全性检查失败。原因:请求向量大于需求向量。\n");
}
return 0;
}
void requestResult()
{
Resource res;
int process;
system("cls");
printf("第几个进程:\n");
scanf("%d",&process);
printf("请求的资源数目(三类资源,空格分开):\n");
scanf("%d%d%d",&res.A,&res.B,&res.C);
if(request(process,res)==1)
{
// for(int i=0;i<5;i++)
// {
// if(Need[i].A==0&&Need[i].B==0&&Need[i].C==0)
// {
// Available.A+=Allo[i].A;
// Available.B+=Allo[i].B;
// Available.C+=Allo[i].C;
// }
// }
printf("请求成功!\n");
printf("安全序列是{P%d,P%d,P%d,P%d,P%d} \n",Safesequence[0],Safesequence[1],Safesequence[2],Safesequence[3],Safesequence[4]);
printresult();
}
else
{
printf("请求失败\n");
}
system("pause");
system("cls");
}
void printresult()
{
printf("Process\t Work \t Need \t Allo\t \t Work+Allo\t Finish\n");
printf("\t A B C| A B C|\t A B C|\t A B C|\n");
for(int j=0;j<N;j++){
int i = Safesequence[j];
printf(" P%d\t %d %d %-1d| %d %d %-1d|\t %d %d %d|\t %-2d %-2d %-1d| %d\n",Safesequence[j],Work[j].A,Work[j].B,Work[j].C,Need[i].A,Need[i].B,Need[i].C,Allo[i].A,Allo[i].B,Allo[i].C,Work[j].A+Allo[i].A,Work[j].B+Allo[i].B,Work[j].C+Allo[i].C,Finish[i]);
}
}
如有错误,望大佬指出!