《C语言实现银行家算法(共8页).docx》由会员分享,可在线阅读,更多相关《C语言实现银行家算法(共8页).docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上C语言实现银行家算法(源码、运行结果)一、 源码/* 银行家算法 10-22*/#include/函数声明void init(int * pcount,int * scount,int Allocation1010,int Need1010,int Available10);void print(int pcount,int scount,int Allocation1010,int Need1010,int Available10);int requs(int scount,int * Requestnumber,int Request10,int Allocati
2、on1010,int Need1010,int Available10);void print2(int isreque,int number);void yhj(int number,int pcount,int scount,int Allocation1010,int Need1010,int Available10);int main()int conti=1; /0退出int pcount=0,scount=0; /进程数 和 资源数int Allocation1010;int Need1010;int Available10;/分配矩阵Allocation 需求矩阵Need 可利用
3、资源向量Available int number=0,Request10=0;/用于记录进程编号 用于记录请求向量while(true)init(&pcount,&scount,Allocation,Need,Available); /调用初始化函数print(pcount,scount,Allocation,Need,Available); /调用打印函数int isreque = requs(scount,&number,Request,Allocation,Need,Available); /调用是否请求函数if(isreque=1)printf(n把资源分配给进程P%d后,资源分配情况
4、如下: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)
5、break;printf(n);return 0;/初始化函数: 提示用户输入 进程数,资源数,Allocation矩阵等void init(int * pcount,int * scount,int Allocation1010,int Need1010,int Available10)int p,s;int i,j;printf(进程数:);scanf(%d,&p);*pcount = p;printf(资源数:);scanf(%d,&s);*scount = s;printf(Allocationn);for(i=0;ip;i+)printf(P%d:,i);for(j=0;js;j+)
6、scanf(%d,&Allocationij);printf(Needn);for(i=0;ip;i+)printf(P%d:,i);for(j=0;js;j+)scanf(%d,&Needij);printf(Available:);for(i=0;is;i+)scanf(%d,&Availablei);printf(n);/打印函数: 打印当前资源分配情况void print(int pcount,int scount,int Allocation1010,int Need1010,int Available10)int i,j;printf(当前资源分配情况:n);printf(Proc
7、ess Allocation Need Availablen);for(i=0;ipcount;i+)printf(P%d ,i);for(j=0;jscount;j+)printf(%3d,Allocationij);printf( );for(j=0;jscount;j+)printf(%3d,Needij);printf( );if(i=0)for(j=0;j=0 & number=4)printf(请输入进程P%d的请求向量,中间用空格键隔开:,number);/接收请求向量for(i=0;iscount;i+)scanf(%d,&Requesti); break; /输入正确 跳出循
8、环elseprintf(请输入有效进程编号!n);/判断请求向量是否合理:是否小于需求向量for(j=0;jNeednumberj)for(j=0;jAvailablej)return 4;return 2;/判断请求向量是否合理:是否小于可利用资源向量bool isrun2 = true;for(j=0;jAvailablej)return 3;/请求向量合理则分配资源/分配资源给请求的进程for(j=0;jscount;j+)/可利用资源数减少Availablej -= Requestj;/进程占用资源数增多Allocationnumberj += Requestj;/需求资源数减少Nee
9、dnumberj -= Requestj;return 1;else return 0;/打印函数:根据请求函数的返回值进行打印void print2(int isreque,int number)if(isreque=2)printf(出错,P%d进程所需要的资源数已超过它所宣布的最大值nn,number);else if(isreque=3)printf(尚无足够资源,P%d进程需等待nn,number);elseif(isreque=4)printf(出错,P%d进程所需要的资源数已超过它所宣布的最大值且尚无足够资源,P%d进程需等待nn,number,number);/银行家算法函数v
10、oid yhj(int number,int pcount,int scount,int Allocation1010,int Need1010,int Available10)/系统执行安全性算法/设置两个向量 Work和Finish,前者表示系统提供给进程继续运行所需的各类资源数目/后者表示系进程是否运行完成int i,j;int Work10; int Finish10=0; /初始化所有元素为0,代表进程未运行完成/初始化向量Work的值 等于 可利用资源向量Available的值for(i=0;iscount;i+)Worki = Availablei;bool iscan; /能否
11、运行: 可利用资源数是否大于或等于进程所需的资源数int k=0,x10; /安全序列 bool issafe = true; /是否安全int n=1;int done=0; printf(n进行安全性检查n);printf(Process Work Need Allocation Work+Allocation Finishn);while(n=pcount)for(i=0;ipcount;i+)/printf(第%d次内循环n,m+);/一行一行的遍历 即对每个进程进行遍历if(Finishi=0)iscan = true; /初始化,假设可利用资源数都大于或等于进程所需的资源数/判断可
12、利用资源数是否大于或等于进程所需的资源数/printf(判断进程P%d能否运行.n,i);for(j=0;jWorkj)iscan = false; /printf(进程P%d不能运行n,i);break;if(iscan = true)Finishi = 1;printf(P%d ,i);/释放该进程前,可利用资源数Workfor(j=0;jscount;j+)printf(%3d,Workj);printf( );/该进程需求变量Needfor(j=0;jscount;j+)printf(%3d,Needij);printf( );/该进程占用资源数Allocationfor(j=0;js
13、count;j+)printf(%3d,Allocationij);printf( );for(j=0;jscount;j+)/进程运行完成,工作向量资源数增加Workj += Allocationij;printf( );/记录该进程至安全序列/printf(k=%d,i=%dn,k,i);xk = i; k+;/释放该进程后,可利用资源数Work+Allocationfor(j=0;jscount;j+)printf(%3d,Workj);printf(t 1);printf(n);/如果可用资源不能满足任何进程的需要 跳出循环/例如n=1 done1则跳出 done = 0;for(i=0;ipcount;i+)if(Finishi=1)done+;if(donen)printf(系统不安全,P%d等待nn,number);break;else if(done=pcount)printf(系统安全,存在着一个安全序列为:);for(i=0;ipcount;i+)if(i=pcount-1)printf(P%d,xi);elseprintf(P%d,xi);printf(nn);break;n+;二、 运行结果注:安全序列并不一定唯一。该算法只能输出其中一个安全序列。专心-专注-专业