您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统——实验2银行家算法
淮海工学院计算机科学系实验报告书课程名:《操作系统原理》题目:实验二银行家算法班级:Z软件161学号:2018140539姓名:陈真杰评语:成绩:指导教师:批阅时间:年月日操作系统原理实验报告1、实验目的与要求银行家算法是操作系统中避免死锁的典型算法,用C/C++语言编写一个银行家算法的模拟程序。通过本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。2、实验内容或题目用C/C++语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。实验说明:初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j],可利用资源数量Available[j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(Need[i,j])则需要由程序根据已知量的值计算产生。3、实验步骤(1)认真理解好课本中银行家算法的实例。(2)根据课本中银行家算法的描述,画出程序流程图。(3)按照程序流程图,用C/C++语言编程并实现。4、流程图操作系统原理实验报告开始结束输入进程个数no1输入资源类数no2输入进程最大需求矩阵Max,已分配矩阵Allocation和可用矩阵矩阵AvailableNeed[][]=Max[][]-Allocation[][]输出当前资源分配表预分配输入需申请资源的进程号输入是否合法输入需申请资源的资源量Request[]Need[][]?Request[]Available[][]?继续分配?调用check()函数继续安全性检查NYYYNNNY5、源代码与测试数据与实验结果(可以抓图粘贴)⑴源代码如下所示:#includestring.h#includeiostreamusingnamespacestd;#defineFALSE0#defineTRUE1#defineW10#defineR20操作系统原理实验报告intM=4;//总进程数intN=3;//资源种类intALL_RESOURCE[3]={9,3,6};//各种资源的数目总和intMAX[4][3]={{3,2,2},{6,1,3},{3,1,4},{4,2,2}};//M个进程对N类资源最大资源需求量intAVAILABLE[R];//系统可用资源数intALLOCATION[4][3]={{1,0,0},{6,1,2},{2,1,1},{0,0,2}};//M个进程已经得到N类资源的资源量intNEED[W][R];//M个进程还需要N类资源的资源量intRequest[R];//请求资源个数voidshowdata()//函数showdata,输出资源分配情况{inti,j;cout各种资源的总数量(all):;cout[;for(j=0;jN;j++)coutALL_RESOURCE[j];cout];coutendlendl;cout系统目前各种资源可用的数为(available):;cout[;for(j=0;jN;j++)coutAVAILABLE[j];cout];coutendlendl;cout各进程已经得到的资源量(allocation):endlendl;cout资源0资源1资源2endl;for(i=0;iM;i++){cout进程pi:;for(j=0;jN;j++)coutALLOCATION[i][j];coutendl;}coutendl;cout各进程还需要的资源量(need):endlendl;cout资源0资源1资源2endl;for(i=0;iM;i++)for(i=0;iM;i++){cout进程pi:;for(j=0;jN;j++)coutNEED[i][j];;coutendl;}操作系统原理实验报告coutendl;}voidchangdata(intk)//分配资源{intj;for(j=0;jN;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];NEED[k][j]=NEED[k][j]-Request[j];}}voidrstordata(intk)//恢复现场{intj;for(j=0;jN;j++){AVAILABLE[j]=AVAILABLE[j]+Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];NEED[k][j]=NEED[k][j]+Request[j];}}intchkerr(ints)//函数chkerr,检查是否安全{intWORK,FINISH[W];inti,j,k=0;for(i=0;iM;i++)FINISH[i]=FALSE;for(j=0;jN;j++){WORK=AVAILABLE[j];i=s;do{if(FINISH[i]==FALSE&&NEED[i][j]=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;i=0;}else{i++;}操作系统原理实验报告}while(iM);for(i=0;iM;i++)if(FINISH[i]==FALSE){coutendl;cout系统不安全!!!本次资源申请不成功!!!endl;coutendl;return1;}}coutendl;cout经安全性检查,系统安全,本次分配成功。endl;coutendl;return0;}voidbank()//银行家算法主体{inti=0,j=0;charflag='Y';while(flag=='Y'||flag=='y'){i=-1;while(i0||i=M){cout请输入需申请资源的进程号(从P0到PM-1,否则重输入!):;coutP;cini;if(i0||i=M)cout输入的进程号不存在,重新输入!endl;}cout请输入进程Pi申请的资源数:endl;for(j=0;jN;j++){cout资源j:;cinRequest[j];if(Request[j]NEED[i][j])//若请求的资源数大于进程还需要i类资源的资源量j{cout进程Pi申请的资源数大于进程Pi还需要j类资源的资源量!;cout申请不合理,出错!请重新选择!endlendl;flag='N';break;操作系统原理实验报告}else{if(Request[j]AVAILABLE[j])//若请求的资源数大于可用资源数{cout进程Pi申请的资源数大于系统可用j类资源的资源量!;cout申请不合理,出错!请重新选择!endlendl;flag='N';break;}}}if(flag=='Y'||flag=='y'){changdata(i);//调用changdata(i)函数,改变资源数if(chkerr(i))//若系统安全{rstordata(i);//调用rstordata(i)函数,恢复资源数showdata();//输出资源分配情况}else//若系统不安全showdata();//输出资源分配情况}else//若flag=N||flag=nshowdata();coutendl;cout是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:;cinflag;}}//主函数intmain(){inti=0,j=0,p;//初始化资源数量for(j=0;jN;j++){p=ALL_RESOURCE[j];for(i=0;iM;i++){p=p-ALLOCATION[i][j];//减去已经被占据的资源AVAILABLE[j]=p;if(AVAILABLE[j]0)AVAILABLE[j]=0;操作系统原理实验报告}}for(i=0;iM;i++)for(j=0;jN;j++)NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];showdata();bank();return0;}⑵运行结果如图所示。图1银行家算法运行测试图6、结果分析与实验体会(1)要找出某一状态下所有可能的安全序列,程序该如何实现?实现查找安全序列只需将各进程Need[][]的值作为输入,直到所有进程的Need[][]为0时结束循环,并打印安全序列。(2)银行家算法的局限性有哪些?银行家算法需要获取进程的最大需求和已分配量,以及T0时刻需要请求的资源量,但操作系统原理实验报告实际情况下很少能够知道进程申请资源的大小,因此局限性较大。
本文标题:操作系统——实验2银行家算法
链接地址:https://www.777doc.com/doc-4763930 .html