一,上机实验内容:
银行家算法
二,银行家算法描述如下:令RRi是进程Pi的资源请求量,如果RRi[j]=k,则进程Pi希望请求分配的j类资源k个,当进程Pi向系统提交一个资源请求向量RRi时,系统调用银行家算法。
三,熟练掌握银行家算法,并解决死锁问题。
四,源程序
# include<stdio.h>
void main()
{ int max_need[5][3]={{3,2,2},{7,5,3},{9,0,2},{2,2,2},{4,3,3}};
int allocation[5][3]={{2,0,0},{0,1,0},{3,0,2},{2,1,1},{0,0,2}};
int i,j,k,l=0,count=0,m=0;
int still_need[5][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
int result[5]={-1,-1,-1,-1,-1};
int current_available[3]={3,3,2};
int tempCount=0;
printf("银行家总共拥有的各类资源的总数: \n A B C\n 10 5 7\n");
printf("银行家目前剩下的各类资源的总数: \n A B C\n 3 3 2\n");
printf("各进程对各类资源的最大需求量: \n A B C\n");
for(i=0;i<5;i++)
{ printf("P%d: ",i);
for(j=0;j<3;j++)
{ printf("%d",max_need[i][j]=max_need[i][j]-allocation[i][j]);
}
printf("\n");
}
printf("各进程已分配到的各类资源:\n A B C\n");
for(i=0;i<5;i++)
{ printf("P%d: ",i);
for(j=0;j<3;j++)
printf("%d",still_need[i][j]);
printf("\n");
}
while(tempCount<=count&&count<5)
{ tempCount++;
for(k=0;k<5;k++)
if(result[k]==-1)
{ m=0;
for(j=0;j<3;j++)
if(still_need[k][j]<=current_available[j]&&still_need[k][j]>=0)
{ current_available[j]=current_available[j]+allocation[k][j];
m++;
if(m==3)
{ result[k]=1;
m=0;
printf("P%d->",k);
count++;
}
}
else break;
}
}
if(count==5)
{ printf("\n 系统安全!上行所示为其中一个进程安全序列 \n");
}
else
printf("\n 找不到一个安全序列,系统不安全!\n");}
运行结果
开 始 申请资源RRi RRi>Ni N RRi>A Y N 给进程Pi 分配资源 调用安全算法 输出符合条件的进程PID 结 束 Y 进程Pi进入等待 进入错误处理 优,流程图