一、实验内容
银行家算法是避免死锁发生的有效算法,预习银行家算法的步骤,算法中包含的数据结构。
1、设计数据结构:可利用资源向量(Availiable),最大需求矩阵(Max),分配矩阵(Allocation),需求矩阵(Need)
2、设计安全检验算法:设置工作向量Work 表示系统可提供进程继续运行可利用资源数目,Finish 表示系统是否有足够的资源分配给进程。
3、5个进程,4类资源
#include<stdio.h>
int available[100],max[100][100],allocation[100][100],line[100],work_allocation[100][100];
char name[100][20];
int bank(int need0[][100],int n0,int m0);
int main()
{
int i,j,m,n,need[100][100],num[100],number,request[100];
int anquan;
printf("请输入资源的种类数目m:");
scanf("%d",&m);
printf("请输入各类资源的数量:\n\n");
// printf("%*s%s%*s%s\n",5,"","名称",1,"","数量(Available)" );
printf("%*s%s\n",5,"","数量(Available)" );
for(i=1;i<=m;i++)
{
printf("资源%d:",i);
// scanf("%s %d",&name[i],&available[i]);
scanf("%d",&available[i]);
}
printf("请输入系统进程的数目n:");
scanf("%d",&n);
printf("请输入各进程对各类资源的最大需求量(n*m的Max矩阵):\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&max[i][j]);
}
}
printf("请输入各类资源当前已经分配给每个进程的资源数(n*m的Allocation矩阵):\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&allocation[i][j]);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
need[i][j]=max[i][j]-allocation[i][j];
}
}
int a;
anquan=bank(need,n,m);
printf("\n\n");
printf("进程号 Available Allocation Need Work_Allocation\n");
for(i=1;i<=n;i++)
{
printf("%d ",line[i]);
a=line[i];
for(j=1;j<=m;j++) printf("%d ",available[j]);
printf(" ");
for(j=1;j<=m;j++) printf("%d ",allocation[a][j]);
printf(" ");
for(j=1;j<=m;j++) printf("%d ",need[a][j]);
printf(" ");
for(j=1;j<=m;j++) printf("%d ",work_allocation[i][j]);
printf("\n");
}
if(anquan==0)
{
printf("不存在安全系列\n");
return 0;
}
else
{
printf("存在安全序列:");
for(i=1;i<n;i++) printf("%d --> ",line[i]);
printf("%d\n\n",line[i]);
}
printf("请输入所要请求资源的进程名:");
scanf("%d",&number);
printf("请输入请求的各类资源的数量:\n");
for(i=1;i<=m;i++)
{
printf("资源%d:",i);
scanf("%d",&request[i]);
}
// int a;
/* for(i=1;i<=n;i++)
{
a=strcmp(name0,name[i]);
if(a==0) break;
} */
for(j=1;j<=m;j++)
{
available[j]=available[j]-request[j];
allocation[number][j]=allocation[number][j]+request[j];
need[number][j]=need[number][j]-request[j];
}
anquan=bank(need,n,m);
if(anquan==0)
{
printf("分配后不存在安全系列,不响应该请求\n");
return 0;
}
else
{
printf("分配后仍存在下列的安全系列,可以响应该请求:");
for(i=1;i<n;i++) printf("%d --> ",line[i]);
printf("%d\n",line[i]);
}
return 0;
}
int bank(int need0[][100],int n0,int m0)
{
int i,j,k,finish[100],work[100],temp;
for(j=1;j<=m0;j++) work[j]=available[j];
for(i=1;i<=n0;i++) finish[i]=0;
temp=1;
for(i=1;i<=n0;i++)
{
for(j=1;j<=n0;j++)
{
if(finish[j]==0)
{
for(k=1;k<=m0;k++)
{
if(need0[j][k]>work[k]) break;
}
if(k>m0)
{
finish[j]=1;
for(k=1;k<=m0;k++)
{
work[k]=work[k]+allocation[j][k];
work_allocation[temp][k]=work[k];
line[temp]=j;
}
temp++;
}
}
}
}
for(i=1;i<=n0;i++)
{
if(finish[i]==0) break;
}
if(i>n0) return 1;
else return 0;
}