您好,欢迎访问三七文档
usingnamespacestd;#defineMAXPROCESS50//所能执行的进程最大数#defineMAXRESOURCE50//资源最大数//银行家算法中的数据结构intAvailable[MAXRESOURCE];//可用资源向量intMax[MAXPROCESS][MAXRESOURCE];//最大需求矩阵intAllocation[MAXPROCESS][MAXRESOURCE];//分配矩阵intNeed[MAXPROCESS][MAXRESOURCE];//需求矩阵intRequest[MAXPROCESS][MAXRESOURCE];//请求向量//安全性算法中的数据结构intWork[MAXRESOURCE];//工作向量boolFinish[MAXPROCESS];//表示是否有足够的资源分配给进程intSafeSeries[MAXPROCESS];//安全序列////////////////////////////////////////////////////intn;//当前系统中的进程数intm;//当前系统中的资源数////////////////////////////////////////////////////////////算法初始化voidInitAlgorithm(){cout请输入系统所要运行的进程总数:;cinn;cout请输入系统中分配的资源种类数:;cinm;inti,j;//可利用资源向量的初始化cout请分别输入m类资源的当前可利用资源数目:;for(i=0;im;++i){cinAvailable[i];}//最大需求矩阵的初始化cout请输入各进程对各资源的最大需求矩阵(按n*m矩阵格式输入):endl;for(i=0;in;++i){for(j=0;jm;++j){cinMax[i][j];}}//分配矩阵的初始化cout请输入分配矩阵(按n*m矩阵格式输入):endl;for(i=0;in;++i){for(j=0;jm;++j){cinAllocation[i][j];}}//需求矩阵的初始化cout请输入此刻的需求矩阵(按n*m矩阵格式输入):endl;for(i=0;in;++i){for(j=0;jm;++j){cinNeed[i][j];}}}//输出资源分配情况voidPrintSrcAlloc(){inti,j;for(i=0;in;++i){cout进程Pi的总体分配情况:endl;cout\tMax:;for(j=0;jm;++j){coutMax[i][j];}coutendl;cout\tAllocation:;for(j=0;jm;++j){coutAllocation[i][j];}coutendl;cout\tNeed:;for(j=0;jm;++j){coutNeed[i][j];}coutendl;coutendl;}cout可利用资源情况:;for(i=0;im;++i){coutAvailable[i];}coutendl;coutendl;}//输出此时进程iProcess利用安全性算法的分析情况voidPrintSafeSeries(intiProcess){intj;cout进程PiProcess的安全性分析情况:endl;cout\tWork:;for(j=0;jm;++j){coutWork[j];}coutendl;cout\tNeed:;for(j=0;jm;++j){coutNeed[iProcess][j];}coutendl;cout\tAllocation:;for(j=0;jm;++j){coutAllocation[iProcess][j];}coutendl;cout\tWork+Allocation:;for(j=0;jm;++j){coutWork[j]+Allocation[iProcess][j];}coutendl;coutFinish[iProcess]=Finish[iProcess]endl;coutendl;}//判断是否存在安全序列boolIsSafe(){inti;for(i=0;in;++i){if(!Finish[i])returnfalse;//不存在安全序列}returntrue;//存在安全序列}//界面voidMenu(){cout\t\t===========================================endl;cout\t\t||endl;cout\t\t|程序:银行家算法的模拟实现|endl;cout\t\t||endl;cout\t\t||endl;cout\t\t||endl;cout\t\t===========================================endl;}//选出满足条件的进程//函数返回进程编号//若不存在满足条件的,则返回false,否则返回trueboolSelectProcess(int&iProcNum){iProcNum=-1;inti,j;for(i=0;in;++i){if(Finish[i])//Finish[i]!=false{continue;}for(j=0;jm;++j){if(Need[i][j]Work[j]){break;}}if(j==m)//满足条件{iProcNum=i;returntrue;}}returnfalse;}//安全性算法boolSafeAlgorithm(){inti,j;//初始化Finish向量for(i=0;in;++i){Finish[i]=false;}//初始化工作向量for(j=0;jm;++j){Work[j]=Available[j];}intiProcNum;//选择满足条件的进程i=0;while(SelectProcess(iProcNum)){Finish[iProcNum]=true;PrintSafeSeries(iProcNum);//输出此时利用安全性算法的分析情况intk;for(k=0;km;++k){Work[k]+=Allocation[iProcNum][k];}SafeSeries[i++]=iProcNum;//进程号加入安全序列数组}if(IsSafe()){returntrue;//存在一个安全序列}returnfalse;//不存在一个安全序列}//银行家算法voidBankAlgorithm(){inti,j;cout请输入请求分配的进程号(0-n-1):;cini;cout请依次输入进程Pi对m类资源的请求分配量:;for(j=0;jm;++j){cinRequest[i][j];}//步骤一for(j=0;jm;++j){if(Request[i][j]Need[i][j]){cout请求的资源已超过该资源宣布的最大值,请求资源失败!!endl;return;}}//步骤二for(j=0;jm;++j){if(Request[i][j]Available[j]){cout没有足够的资源,请求资源失败!!endl;return;}}//步骤三//系统试探着把资源分配给进程Pi,并修改相应的数值for(j=0;jm;++j){Available[j]-=Request[i][j];Allocation[i][j]+=Request[i][j];Need[i][j]-=Request[i][j];}//步骤四//系统执行安全性算法if(!SafeAlgorithm())//检测到不安全,则恢复原来的状态{for(j=0;jm;++j){Available[j]+=Request[i][j];Allocation[i][j]-=Request[i][j];Need[i][j]+=Request[i][j];}}}intmain(){Menu();InitAlgorithm();PrintSrcAlloc();//打印当前资源情况system(pause);SafeAlgorithm();while(1){stringflag;if(IsSafe()){//存在安全序列cout恭喜!!资源分配成功!!endl;inti;cout此时刻存在的一个安全序列为:;for(i=0;in-1;++i){coutPSafeSeries[i]--;}coutPSafeSeries[i]endl;cout继续操作吗?[Y/N]:;cinflag;}else{cout资源分配失败!!endl;cout继续操作吗?[Y/N]:;cinflag;}if(flag==Y||flag==y){;}else{break;}BankAlgorithm();//执行银行家算法}return0;
本文标题:46银行家算法
链接地址:https://www.777doc.com/doc-3461988 .html