#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
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
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
for(j=0;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
for(j=0;j
}
}
//剩余资源数
for(j=0;j
for(j=0;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
scanf("%d",&request[i][j]);
}
for(j=0;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
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;i
for(i=0;i
work=(int*)malloc(m*sizeof(int));
work=available;
loop: for(i=0;i
{for(j=0;j
else break;
if(j==m)//该进程可以获得所需资源,即该进程可以完成,完成后释放资源
{for(j=0;j
finish[i]=1;
success[p++]=i;
goto loop;
}
}
for(k=0;k
else break;
if(k==n)
{printf("调度顺序:\n");
for(i=0;i
return 1;}
else return 0;
manue();
}