根据书上P180页的伪代码改写,实现P179页的实例
#include<stdio.h>
int available[3] = {0,1,1}; //可用资源
int claim[4][3] = {{3,2,2},{6,1,3},{3,1,4},{4,2,2}}; //进程的资源需求
int alloc[4][3] = {{1,0,0},{6,1,2},{2,1,1},{0,0,2}}; //已分配给进程的资源
//显示进程占用资源的情况
void show(){
int i,j;
printf("系统中每种资源的总量\n");
for(i=0;i<3;i++){
printf("%d ",resource[i]);
}
printf("\n");
printf("未分配给进程的每种资源的总量\n");
for(i=0;i<3;i++){
printf("%d ",available[i]);
}
printf("\n");
printf("进程对资源的需求\n");
for(j=0;j<4;j++){
printf("P");
printf("%d ",j+1);
for(i=0;i<3;i++){
printf("%d ",claim[j][i]);
}
printf("\n");
}
printf("已分配资源\n");
for(j=0;j<4;j++){
printf("P");
printf("%d ",j+1);
for(i=0;i<3;i++){
printf("%d ",alloc[j][i]);
}
printf("\n");
}
}
//银行家算法
int safe(){
int i,j,t,count = 0,count_1 = 0;
int n = 1;
int num[4] = {0,0,0,0} ; //状态量
int currentavail[3]; //设置剩余资源总量
for(i=0;i<3;i++)
{
currentavail[i] = available[i];
}
while(n)
{
for(j=0;j<4;j++)
{
for(i=0;i<3;i++)
{
if(claim[j][i] - alloc[j][i] <= currentavail[i])
num[j] ++;
} //查找是否有需求小于可用的进程
if(num[j] == 3)
{
for(t=0;t<3;t++)
currentavail[t] = currentavail[t] + alloc[j][t];
printf("此时%d进程满足条件\n",j);
break; //释放前面查找到的进程
}
if(j == 3)
{
n = 0;
printf("循环结束",j);
break; //若循环一遍未找到就跳出循环
}
}
}
for(i=0;i<3;i++)
{
if(currentavail[i] == resource[i])
count ++;
}
return count; //返回找到的进程数
}
//资源分配算法
void fpsf()
{
//先分配进程
int i,a,num,count = 0,count_1 = 0,count_request = 0,count_available = 0;
int request[3];
printf("要分配的进程序号为:");
scanf("%d",&num);
num = num - 1;
for(i = 0; i < 3; i++)
{
scanf("%d", &request[i]);
}
for(i = 0; i < 3; i++)
{
if(alloc[num][i] + request[i] > claim[num][i])
count++;
if(request[i] > request[i])
count_1++;
}
if(count > 0)
{
printf("error");
exit();
} /* total request > claim */
else if(count_1 > 0)
{
printf("suspend process");
exit();
} /* simulate alloc */
else{
printf("ok");
for(i = 0; i < 3; i++){
alloc[num][i] = alloc[num][i] + request[i];
available[i] = available[i] - request[i];
}
}
printf("开始测试是否安全!\n");
a = safe();
if(a == 3)
{
printf("结果是安全状态");
}
else
{
printf("结果不是安全状态,阻塞改进程");
}
}
int main()
{
show();
fpsf();
show();
return 0;
}