银行家算法C语言实现 第2页
{ available1[j]=available[j]; /* 保存原已分配的资源数,
allocation1[i][j]=allocation[i][j]; 仍需要的资源数,和可用的
need1[i][j]=need[i][j]; 资源数*/
available[j]=available[j]-req[j]; / * 系统尝试把资源分配
allocation[i][j]=allocation[i][j]+req[j]; 给请求的进程 */
need[i][j]=need[i][j]-req[j];
}
print();
check(); //进行安全检测
if (r==0) //分配后状态不安全
{for (j=0;j<m; j++)
{available[j]=available1[j]; /* 还原分配前的已分配的资
allocation[i][j]=allocation1[i][j]; 源数,仍需要的资源数
need[i][j]=need1[i][j]; 和可用的资源数 */
}
printf("return:\n");
print();
}
}
}
printf("\nDo you want to continue? y or n?\n"); //判断是否继续进行资源分配
} while (getch()=='y');
}
}
void check() //检测函数
{int k, f, v=0,i,j;
int work[M],a[M],finish[M];
r=1;
for(i=0;i<n; i++)
finish[i]=0; //初始化各进程均没得到足够资源并完成
for(i=0;i<m; i++)
work[i]=available[i]; //用work[i]表示可提供进程继续运行的各类资源数
k=n;
do{
for (i=0;i<n; i++)
{if (finish[i]==0)
{f=1;
for (j=0;j<m; j++)
if (need[i][j]>work[j])
f=0;
if (f==1) /*找到还没完成的且需求数小于可提供进程继续运行的
{finish[i]=1; 资源数的进程*/
a[v++]=i; //记录安全序列
for (j=0;j<m; j++)
work[j]=work[j]+allocation[i][j]; //释放该进程已分配的资源
}
}
}
k--;
}while(k>0);
f=1;
for (i=0;i<n; i++) //判断是否所有的进程都完成
{
if (finish[i]==0)
{
f=0;
break;
}
}
if (f==0) //若有进程没完成,则为不安全状态
{
printf("This is unsafe \n");
r=0;
}
else // 否则为安全状态
{
printf("This is safe and the safe number is:");
for (i=0;i<n;i++)
printf ("%d ",a[i]); //输出安全序列
}
}
void print() //输出函数
{ int i, j;
int process[M];
printf("Process\t Allocation\t Need\n");
若图片无法显示请联系QQ3249114,银行家算法C语言实现 第2页系统免费,转发请注明源于www.751com.cn
printf("%2d ",need[i][j]);
printf("\n");
}
printf("Available\n");
for(i=0;i<m; i++)
printf("%2d ",available[i]);
printf("\n");
}
运行以上程序代码,其中一种输出结果如下: