# include <string.h>
# define M 100
# define N 100
int r;
typedef struct {
int Available[N];
int Max[M][N];
int Allocation[M][N];
int Need[M][N];
int Work[N];
char Finish[M];
}bank;
test(int a,int b,bank d)// n为进程数,m为资源总类//
{
d.Finish[M],d.Work[M];
int i,j,k,flag;//i为行数,j为列数,k为未完成的进程数,flag标志进程的状态//
int c[100];//用于记录安全序列//
r=1;int v=0;
for(i=0;i<a;i++)
d.Finish[i]=false; // 初始化进程均没得到足够资源数并完成
for(i=0;i<b;i++)
d.Work[i]=d.Available[i];//work[i]表示可提供进程继续运行的各类资源数
k=a;
do{
for(i=0;i<a;i++)
{
if(d.Finish[i]==false)
{
flag=1;
for(j=0;j<b;j++)
if(d.Need[i][j]>d.Work[j])
flag=0;
if(flag==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程
{
d.Finish[i]=true;
c[v++]=i; //记录安全序列号
for(j=0;j<b;j++)
d.Work[j]+=d.Allocation[i][j]; //释放该进程已分配的资源
}
}
}
k--; //每完成一个进程分配,未完成的进程数就减1
}while(k>0);
flag=1;
for(i=0;i<a;i++) //判断是否所有的进程都完成
{
if(d.Finish[i]==false)
{
flag=0;
break;
}
}
if(flag==0) //若有进程没完成,则为不安全状态
{
printf("系统处在不安全状态!");
r=0;
}
else
{
printf("\n系统当前为安全状态,安全序列为:\n");
for(i=0;i<a;i++)
printf("p%d ",c[i]); //输出安全序列
}
}
void main()
{
int m,n,i,j,e,p,res,need[M][N];//m代表资源种类,n代表进程个数,i代表行数,j代表列数,e代表所需最大资源数,p代表分配的资源数//
char name[20];
bank b;
printf("Input the type of resource and number of customer:\n");
scanf("%d%d",&m,&n);
printf("Input the amount of resource (maximum , allocated) of each customer:\n");
for(i=0;i<n;i++)
{
scanf("%s",name);
for (j=0;j<m;j++)
{
scanf ("%d",&e);
b.Max[i][j]=e;
}
for (j=0;j<m;j++)
{
scanf("%d",&p);
b.Allocation[i][j]=p;
}
}
for (i=0;i<n;i++)
for (j=0;j<m;j++)
b.Need[i][j]=b.Max[i][j]-b.Allocation[i][j];
printf("Input the amount of resource(available)\n");
for(j=0;j<m;j++)
{
scanf("%d",&res);
res=b.Available[j];
}
test(n,m,b);
}
//检测安全序列//
不论怎么输,出来的都是不安全状态
3 个解决方案
#1
樓主這個程序在做什麽?
#2
#3
操作系统耶,没学深入,有点难度
#1
樓主這個程序在做什麽?
#2
#3
操作系统耶,没学深入,有点难度