操作系统作业(初版)
银行家算法
# include<stdio.h>
# define kinds 3//三种资源
# define processNum 5 //五种进程
# define true 1
# define false 0
int Avaliable[kinds]={3,3,2};//可利用资源,一共有三种资源
int Max[processNum][kinds]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};//最大需求矩阵
int Allocation[processNum][kinds]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
//已经分配的资源
int need[processNum][kinds]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};
//还需要的资源
int request[kinds]={1,1,1};//新申请的资源
int finish[processNum]={0,0,0,0,0};
int out[processNum];
int work[kinds];
bool getout=true;//判断是否能够执行分配
bool safecheck()
{
printf("开始进行安全性检测\n");
int i,k,j,h=0;
for(i=0;i<kinds;i++)
work[i]=Avaliable[i];
for(i=0;i<kinds;i++)
//printf("work%d:%d ",i,work[i]);
//printf("\n");
int count=0;
for(k=0;k<processNum;k++)
for(i=0;i<processNum;i++)
{
if(finish[i]==false)
{
int count=0;
for(j=0;j<kinds;j++)
{
if(need[i][j]<=work[j])
count++;
}
if(count==kinds)
{
for(j=0;j<kinds;j++)
{
work[j]=work[j]+Allocation[i][j];
}
finish[i]=true;
printf("finish %d:%d\n",i,finish[i]);
out[h]=i;
h++;
}
}
}
int count=0;
for(i=0;i<processNum;i++)
{
if(finish[i]==true)
count++;
}
if(count==processNum)
return true;
else
return false;
}
bool check()
{
int i=0,j=0;
printf("请输入需要插入的进程(1-5)\n");
while(1)
{
int h;
scanf("%d",&h);
i=h-1;
if(i<=4&&i>=0)
break;
printf("请输入正确的进程\n");
}
printf("选择进程完成\n");
for(j=0;j<kinds;j++)
{
// printf("request:");
// printf("%d ",request[j]);
// printf("need:");
// printf("%d ",need[i][j]);
if(request[j]>need[i][j])
{
printf("所需要的资源数已超过它所宣布的最大值\n");
return 1;
}
}
for(j=0;j<kinds;j++)
{
if(request[j]>Avaliable[j])
{
printf("尚无足够资源\n");
return 1;
}
}
//for(i=0;i<processNum;i++)
for(j=0;j<kinds;j++)
{
Avaliable[j]=Avaliable[j]-request[j];
//printf("avaliable%d:%d\n",j,Avaliable[j]);
Allocation[i][j]=Allocation[i][j]+request[j];
need[i][j]=need[i][j]-request[j];
}
printf("开始尝试分配\n");
bool safe=safecheck();
//printf("safe:%d\n",safe);
if(safe==true)
{
printf("安全\n");
printf("安全运行顺序为:");
for(i=0;i<processNum;i++)
{
printf("%d",out[i]+1);
}
}
else
{
printf("不安全");
for(i=0;i<processNum;i++)
for(j=0;j<kinds;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 main()
{
int choose=0;
check();
}
二版
# include<stdio.h>
# define kinds 3//三种资源
# define processNum 5 //五种进程
# define true 1
# define false 0
int Avaliable[kinds]={3,3,2};//可利用资源,一共有三种资源
int Max[processNum][kinds]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};//最大需求矩阵
int Allocation[processNum][kinds]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
//已经分配的资源
int need[processNum][kinds]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};
//还需要的资源
int request[kinds]={1,1,1};//新申请的资源
int finish[processNum]={0,0,0,0,0};
int out[processNum];
int work[kinds];
bool getout=true;//判断是否能够执行分配
void checkInit()
{
for (int i = 0; i < processNum; i++)
{
for (int j = 0; j < kinds; j++)
{
if (Max[i][j] < 0)
printf("max[%d][%d]输入值小于0\n",i,j);
if (Allocation[i][j] < 0)
printf("allocation[%d][%d]输入值小于0\n",i,j);
if (Allocation[i][j]>Max[i][j])
printf("man[%d][%d]输入值小于allocation[%d][%d]输入值\n",i,j,i,j);
}
}
printf("输入检查完毕\n");
}
void init()
{
int i,j;
for (int i = 0; i < processNum; i++)
{
printf("第%d个进程对各个资源的最大需求量\n:",i);
for (int j = 0; j < kinds; j++)
scanf("%d",&Max[i][j]);
printf("第%d个进程对各个资源的已分配量\n:",i);
for (int j = 0; j < kinds; j++)
scanf("%d",&Allocation[i][j]);
for (int j = 0; j < kinds; j++)
need[i][j]=Max[i][j]-Allocation[i][j];
}
checkInit();
}
bool safecheck()
{
printf("开始进行安全性检测\n");
int i,k,j,h=0;
for(i=0;i<kinds;i++)
work[i]=Avaliable[i];
for(i=0;i<kinds;i++)
//printf("work%d:%d ",i,work[i]);
//printf("\n");
int count=0;
for(k=0;k<processNum;k++)
for(i=0;i<processNum;i++)
{
if(finish[i]==false)
{
int count=0;
for(j=0;j<kinds;j++)
{
if(need[i][j]<=work[j])
count++;
}
if(count==kinds)
{
for(j=0;j<kinds;j++)
{
work[j]=work[j]+Allocation[i][j];
}
finish[i]=true;
//printf("finish %d:%d\n",i,finish[i]);
out[h]=i;
h++;
}
}
}
int count=0;
for(i=0;i<processNum;i++)
{
if(finish[i]==true)
count++;
}
if(count==processNum)
return true;
else
return false;
}
bool check()
{
int i=0,j=0;
printf("请输入需要插入的进程(1-5)\n");
while(1)
{
int h;
scanf("%d",&h);
i=h-1;
if(i<=4&&i>=0)
break;
printf("请输入正确的进程\n");
}
printf("选择进程完成\n");
for(j=0;j<kinds;j++)
{
// printf("request:");
// printf("%d ",request[j]);
// printf("need:");
// printf("%d ",need[i][j]);
if(request[j]>need[i][j])
{
printf("所需要的资源数已超过它所宣布的最大值\n");
return 1;
}
}
for(j=0;j<kinds;j++)
{
if(request[j]>Avaliable[j])
{
printf("尚无足够资源\n");
return 1;
}
}
//for(i=0;i<processNum;i++)
for(j=0;j<kinds;j++)
{
Avaliable[j]=Avaliable[j]-request[j];
//printf("avaliable%d:%d\n",j,Avaliable[j]);
Allocation[i][j]=Allocation[i][j]+request[j];
need[i][j]=need[i][j]-request[j];
}
printf("开始尝试分配\n");
bool safe=safecheck();
//printf("safe:%d\n",safe);
if(safe==true)
{
printf("安全\n");
printf("安全运行顺序为:");
for(i=0;i<processNum;i++)
{
printf("%d",out[i]+1);
}
printf("\n");
}
else
{
printf("不安全");
for(i=0;i<processNum;i++)
for(j=0;j<kinds;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;
}
void Menu()
{
printf("------------------Banker----------------------\n");
printf("* 1.初始化数据 *\n");
printf("* 2.显示资源分配情况 *\n");
printf("* 3.退出 *\n");
printf("----------------------------------------------\n");
printf("请选择:\n");
}
int main()
{
int choose=0;
while(1)
{
Menu();
scanf("%d",&choose);
switch (choose)
{
case 1:
init();
break;
case 2:
check();
break;
case 3:
printf("系统退出");
return 1;
default:
printf("看看!请输入1-3");
break;
}
}
}