C语言实现银行家算法源代码

  • 格式:docx
  • 大小:37.20 KB
  • 文档页数:3

C语言实现银行家算法源代码

#include"stdio.h"

#definemaxprocess50/*最大进程数*/#definemaxresource100/*最大资源数*/#definetrue1#definefalse0

intavailable[maxresource];/*需用资源数组*/intmax[maxprocess][maxresource];/*最小市场需求矩阵*/intallocation[maxprocess][maxresource];/*分配矩阵*/intneed[maxprocess][maxresource];/*市场需求矩阵*/intrequest[maxprocess][maxresource];/*进程须要资源数*/

intfinish[maxprocess];/*系统是否有足够的资源分配*/intp[maxprocess];/*记录序列*/intm,n;/*m个进程,n个资源*/voidinit();intsafe();voidbank();voidmain(){init();safe();bank();

}/*最小资源数*/

voidinit()/*初始化算法*/{inti,j;

printf("恳请输出进程的数目:\\n");scanf("%d",&m);

printf("请输入资源的种类:\\n");scanf("%d",&n);

printf("恳请输出每个进程最多所须要的各资源数,按照%dx%d矩阵输出\\n",m,n);for(i=0;i

scanf("%d",&max[i][j]);

printf("恳请输出每个进程已分配的各资源数,也按照%dx%d矩阵输出\\n",m,n);for(i=0;i

for(j=0;j

scanf("%d",&allocation[i][j]);

need[i][j]=max[i][j]-allocation[i][j];if(need[i][j]<0){

printf("您输出的第%d个进程所具有的第%d个资源数错误,恳请再次输出:\\n",i+1,j+1);j--;continue;}}}

printf("请输入各个资源现有的数目:\\n");for(i=0;i

scanf("%d",&available[i]);}} intsafe()/*安全性算法,返回值:true,false*/{

inti,j,k,l=0;

intwork[maxresource];/*工作数组*/for(i=0;i

finish[i]=false;}

for(i=0;i

if(finish[i]==true){continue;}else{

for(j=0;j

if(need[i][j]>work[j]){break;}}if(j==n){

finish[i]=true;for(k=0;k

{

work[k]+=allocation[i][k];}p[l++]=i;i=-1;}else{continue;}}if(l==m){

//cout<<"系统就是安全的"<

//cout<<"安全序列:"<

//cout<

printf("%d",p[i]);if(i!=l-1){

printf("-->");}}

returntrue;}}

printf("系统就是不安全的\\n");returnfalse;}

voidbank()/*银行家算法*/{

inti,cusneed;charagain;while(1){

printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类推)\\n");scanf("%d",&cusneed);

printf("恳请输出进程所命令的各资源的数量\\n");for(i=0;i

scanf("%d",&request[cusneed][i]);} for(i=0;i

if(request[cusneed][i]>need[cusneed][i]){

printf("您输出的命令数少于进程的需求量!恳请再次输出!\\n");continue;}

if(request[cusneed][i]>available[i]){

printf("您输出的命令数少于系统有的资源数!恳请再次输出!\\n");continue;}}

for(i=0;i

available[i]-=request[cusneed][i];

allocation[cusneed][i]+=request[cusneed][i];need[cusneed][i]-=request[cusneed][i];}if(safe()){

printf("同意分配命令!\\n");}else{

printf("您的请求被拒绝!\\n");for(i=0;i

available[i]+=request[cusneed][i];

allocation[cusneed][i]-=request[cusneed][i];need[cusneed][i]+=request[cusneed][i];}}

for(i=0;i

finish[i]=false;}

printf("您还想要再次命令分配吗?就是恳请按y/y,否请按其它键\\n");scanf("%c",&again);

if(again=='y'||again=='y'){continue;}break;}}