当前位置:文档之家› 操作系统银行家算法C语言实现源代码

操作系统银行家算法C语言实现源代码

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
int m,n,*available,**max,**allocation,**need,**request,*success;//n个进程,m种资源
void set();
int check();
void newrequest();
void manue();
void main()
{
manue();
}
void manue()
{int i,k;
do{
printf("请选择您要进行的操作:\n");
printf("0退出\n");
printf("1系统状态初始化\n");
printf("2检验当前状态是否安全\n");
printf("3有进程提出新的请求\n");
scanf("%d",&i);
switch(i)
{case 1:set();break;
case 2:k=check();
if(k==1) printf("系统安全\n");
else printf("系统不安全\n");break;
case 3:newrequest();break;
}
}while(i!=0);
}
void set()
{int i,j,k,l,q;
printf("请输入系统中现有多少种资源:\n");
scanf("%d",&m);//m种资源
available=(int*)malloc(m*sizeof(int));
printf("根据提示输入系统中各类资源的现有情况:\n");
for(i=0;i{printf("输入系统中资源R%d的数量:\n",i);
scanf("%d",&available[i]);
printf("系统中资源R%d的数量为%d\n",i,available[i]);
}
//初始化系统中的进程情况
printf("输入系统中现有进程的数量\n");
scanf("%d",&n);
max=(int**)malloc(n*sizeof(int));
request=(int**)malloc(n*sizeof(int));
allocation=(int**)malloc(n*sizeof(int));
need=(int**)malloc(n*sizeof(int));
for(l=0;l{max[l]=(int*)malloc(m*sizeof(int));
request[l]=(int*)malloc(m*sizeof(int));
allocation[l]=(int*)malloc(m*sizeof(int));
need[l]=(int*)malloc(m*sizeof(int));
}
printf("根据提示输入相关信息\n");
for(i=0;i{printf("进程P%d\n",i);
for(j=0;j{printf("最多需要资源R%d的数量:\n",j);
scanf("%d",&max[i][j]);
printf("输入已分配到此类资源的数量\n");
scanf("%d",&allocation[i][j]);
need[i][j]=max[i][j]-allocation[i][j];
}
}
//显示当前系统状态
printf("目前系统中");
for(i=0;i{printf("进程P%d",i);
for(j=0;j{printf("最大需要资源R%d %d个,已分得%d个,还需要%d个\n",j,max[i][j],allocation[i][j],need[i][j]);
}
}
//剩余资源数
for(j=0;jfor(i=0;iavailable[j]=available[j]-allocation[i][j];
for(j=0;jprintf("系统中有资源R%d %d个\n",j,available[j]);
q=check();
if(q==1) printf("系统安全\n");
else printf("系统不安全\n");
manue();
}
void newrequest()
{int i,j,k;
printf("按提示输入相应信息\n");
printf("输入提出资源请求的进程\n");
scanf("%d",&i);
printf("提出资源请求的进程是P%d\n",i);
for(j=0;j{printf("需要资源R%d的数量为:",j);
scanf("%d",&request[i][j]);
}
for(j=0;jif(request[i][j]<=need[i][j])
{{available[j]=available[j]-request[i][j];
allocation[i][j]=allocation[i][j]+request[i][j];
need[i][j]=need[i][j]-request[i][j];
}
k=check();
if(k==0)//不予分配,恢复
{printf("系统不安全,资源分配失败\n");
for(j=0;j{available[j]=available[j]+request[i][j];
allocation[i][j]=allocatio

n[i][j]-request[i][j];
need[i][j]=need[i][j]+request[i][j];
}}
else printf("分配成功\n");
}
else {printf("错误,请求大于所需。\n");break;}
manue();
}
//检查系统是否安全,安全则输出一个调度序列,并返回1,否则返回0
int check()
{int *finish,*work,i,j,k,p=0;
finish=(int*)malloc(n*sizeof(int));
success=(int*)malloc(n*sizeof(int));
for(i=0;isuccess[i]=0;
for(i=0;ifinish[i]=0;
work=(int*)malloc(m*sizeof(int));
work=available;
loop: for(i=0;iif(finish[i]==0)
{for(j=0;jif(need[i][j]<=work[j]);
else break;
if(j==m)//该进程可以获得所需资源,即该进程可以完成,完成后释放资源
{for(j=0;jwork[j]=work[j]+allocation[i][j];
finish[i]=1;
success[p++]=i;
goto loop;
}
}
for(k=0;kif(finish[k]==1);
else break;
if(k==n)
{printf("调度顺序:\n");
for(i=0;iprintf("->P%d",success[i]);
return 1;}
else return 0;
manue();
}

相关主题
文本预览
相关文档 最新文档