C语言实现银行家算法(源码、运行结果)一、源码/*银行家算法10-22*/#includestdio.h//函数声明voidinit(int*pcount,int*scount,intAllocation[10][10],intNeed[10][10],intAvailable[10]);voidprint(intpcount,intscount,intAllocation[10][10],intNeed[10][10],intAvailable[10]);intrequs(intscount,int*Requestnumber,intRequest[10],intAllocation[10][10],intNeed[10][10],intAvailable[10]);voidprint2(intisreque,intnumber);voidyhj(intnumber,intpcount,intscount,intAllocation[10][10],intNeed[10][10],intAvailable[10]);intmain(){intconti=1;//0退出intpcount=0,scount=0;//进程数和资源数intAllocation[10][10];intNeed[10][10];intAvailable[10];//分配矩阵Allocation需求矩阵Need可利用资源向量Availableintnumber=0,Request[10]={0};//用于记录进程编号用于记录请求向量while(true){init(&pcount,&scount,Allocation,Need,Available);//调用初始化函数print(pcount,scount,Allocation,Need,Available);//调用打印函数intisreque=requs(scount,&number,Request,Allocation,Need,Available);//调用是否请求函数if(isreque==1){printf(\n把资源分配给进程P%d后,资源分配情况如下:\n,number);print(pcount,scount,Allocation,Need,Available);//调用打印函数yhj(number,pcount,scount,Allocation,Need,Available);//调用银行家算法函数}elseif(isreque==0)yhj(number,pcount,scount,Allocation,Need,Available);//调用银行家算法函数elseprint2(isreque,number);printf(是否继续?0退出,1继续:);scanf(%d,&conti);printf(\n);if(conti==0)break;}printf(\n);return0;}//初始化函数:提示用户输入进程数,资源数,Allocation矩阵等voidinit(int*pcount,int*scount,intAllocation[10][10],intNeed[10][10],intAvailable[10]){intp,s;inti,j;printf(进程数:);scanf(%d,&p);*pcount=p;printf(资源数:);scanf(%d,&s);*scount=s;printf(Allocation\n);for(i=0;ip;i++){printf(P%d:,i);for(j=0;js;j++){scanf(%d,&Allocation[i][j]);}}printf(Need\n);for(i=0;ip;i++){printf(P%d:,i);for(j=0;js;j++){scanf(%d,&Need[i][j]);}}printf(Available:);for(i=0;is;i++)scanf(%d,&Available[i]);printf(\n);}//打印函数:打印当前资源分配情况voidprint(intpcount,intscount,intAllocation[10][10],intNeed[10][10],intAvailable[10]){inti,j;printf(当前资源分配情况:\n);printf(ProcessAllocationNeedAvailable\n);for(i=0;ipcount;i++){printf(P%d,i);for(j=0;jscount;j++){printf(%3d,Allocation[i][j]);}printf();for(j=0;jscount;j++){printf(%3d,Need[i][j]);}printf();if(i==0){for(j=0;jscount;j++)printf(%3d,Available[j]);}printf(\n);}}//是否请求函数:是否有进程提出请求返回0-代表无请求返回1-代表有请求且正确返回2-代表有请求但超过最大值返回3-代表有请求但无足够资源返回4-代表即无足够资源也超过了最大值intrequs(intscount,int*Requestnumber,intRequest[10],intAllocation[10][10],intNeed[10][10],intAvailable[10]){//判断是否有进程提出请求boolisrequest;inti,j;intnumber;printf(是否有进程提出请求?(0没有1有):);scanf(%d,&isrequest);if(isrequest==1){//提醒用户输入进程编号及其请求向量//若用户输入有误,进行提示并继续循环,否则跳出循环。while(true){printf(请输入提出请求的进程编号【0-4】:);//接收进程编号scanf(%d,&number);*Requestnumber=number;if(number=0&&number=4){printf(请输入进程P%d的请求向量,中间用空格键隔开:,number);//接收请求向量for(i=0;iscount;i++){scanf(%d,&Request[i]);}break;//输入正确跳出循环}else{printf(请输入有效进程编号!\n);}}//判断请求向量是否合理:是否小于需求向量for(j=0;jscount;j++){if(Request[j]Need[number][j]){for(j=0;jscount;j++){if(Request[j]Available[j])return4;}return2;}}//判断请求向量是否合理:是否小于可利用资源向量boolisrun2=true;for(j=0;jscount;j++){if(Request[j]Available[j])return3;}//请求向量合理则分配资源//分配资源给请求的进程for(j=0;jscount;j++){//可利用资源数减少Available[j]-=Request[j];//进程占用资源数增多Allocation[number][j]+=Request[j];//需求资源数减少Need[number][j]-=Request[j];}return1;}elsereturn0;}//打印函数:根据请求函数的返回值进行打印voidprint2(intisreque,intnumber){if(isreque==2)printf(出错,P%d进程所需要的资源数已超过它所宣布的最大值\n\n,number);elseif(isreque==3)printf(尚无足够资源,P%d进程需等待\n\n,number);elseif(isreque==4)printf(出错,P%d进程所需要的资源数已超过它所宣布的最大值且尚无足够资源,P%d进程需等待\n\n,number,number);}//银行家算法函数voidyhj(intnumber,intpcount,intscount,intAllocation[10][10],intNeed[10][10],intAvailable[10]){//系统执行安全性算法//设置两个向量Work和Finish,前者表示系统提供给进程继续运行所需的各类资源数目//后者表示系进程是否运行完成inti,j;intWork[10];intFinish[10]={0};//初始化所有元素为0,代表进程未运行完成//初始化向量Work的值等于可利用资源向量Available的值for(i=0;iscount;i++){Work[i]=Available[i];}booliscan;//能否运行:可利用资源数是否大于或等于进程所需的资源数intk=0,x[10];//安全序列boolissafe=true;//是否安全intn=1;intdone=0;printf(\n进行安全性检查\n);printf(ProcessWorkNeedAllocationWork+AllocationFinish\n);while(n=pcount){for(i=0;ipcount;i++){//printf(第%d次内循环\n,m++);//一行一行的遍历即对每个进程进行遍历if(Finish[i]==0){iscan=true;//初始化,假设可利用资源数都大于或等于进程所需的资源数//判断可利用资源数是否大于或等于进程所需的资源数//printf(判断进程P%d能否运行...\n,i);for(j=0;jscount;j++){if(Need[i][j]Work[j]){iscan=false;//printf(进程P%d不能运行\n,i);break;}}if(iscan==true){Finish[i]=1;printf(P%d,i);//释放该进程前,可利用资源数Workfor(j=0;jscount;j++){printf(%3d,Work[j]);}printf();//该进程需求变量Needfor(j=0;jscount;j++){printf(%3d,Need[i][j]);}printf();//该进程占用资源数Allocationfor(j=0;jscount;j++){printf(%3d,Allocation[i][j]);}printf();for(j=0;jscount;j++){//进程运行完成,工作向量资源数增加Work[j]+=Allocation[i][j];}printf();//记录该进程至安全序列//printf(k=%d,i=%d\n,k,i);x[k]=i;k++;//释放该进程后,可利用资源数Work+Allocationfor(j=0;jscount;j++){printf(%3d,Work[j]);}printf(\t1);printf(\n);}}}//如果可用资源不能满足任何进程的需要跳出循环//例如n=1done1则跳出done=0;for(i=0;ipcount;i++){if(Finish[i]==1){done++;}}if(donen){printf(系统不安全,P%d等待\n\n,number);break;}elseif(done==pcount){printf(系统安全,存在着一个安全序列为:);for(i=0;ipcount;i++){if(i==pcount-1)printf(P%d,x[i]);elseprintf(P%d,,x[i]);}printf(\n\n);break;}n++;}}二、运行结果注:安全序列并不一定唯一。该算法只能输出其中一个安全序列。