淮海工学院计算机工程学院实验报告书课程名:《操作系统原理》题目:银行家算法班级:学号:姓名:评语:成绩:指导教师:批阅时间:年月日《操作系统原理》实验报告-1-一、实验目的银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。实验环境TurboC2.0/3.0或VC++6.0实验学时4学时,必做实验。二、实验内容用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。三、实验说明实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。四、实验步骤1、理解本实验中关于两种调度算法的说明。2、根据调度算法的说明,画出相应的程序流程图。3、按照程序流程图,用C语言编程并实现。五、分析与思考1.要找出某一状态下所有可能的安全序列,程序该如何实现?答:要找出这个状态下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而系统的状态可通过以下来描述:进程剩余申请数=最大申请数-占有数;可分配资源数=总数-占有数之和;通过这个描述来算出系统是否安全,从而找出所有的安全序列。2.银行家算法的局限性有哪些?答:银行家算法是一种最有代表性的避免死锁的算法。银行家算法即把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资《操作系统原理》实验报告-2-源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。但任何一种算法都存在其缺点,对各进程的资源分配要求严格,经常使其处于不安全状态,银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。六、测试数据与实验结果银行家算法流程图(1)所示:结束否是申请失败。以上分配作废,恢复原来的分配状态:Available[j]=Available[j]+Requesti[j]Allocation[i][j]=Allocation[i][j]-Requesti[j]Need[i][j]=Need[i][j]+Requesti[j]NYNYRequesti[j]Need[i][j]出错返回:return(error)Requesti[j]Available[j]出错返回:(进程阻塞)return(error)Available[j]=Available[j]–Requesti[j]Allocation[i][j]=Allocation[i][j]+Requesti[j]Need[i][j]=Need[i][j]–Requesti[j]假定分配:输入初始参数(资源分配及请求情况)开始假定分配之后,系统安全吗?申请成功。输出各种数据的变化图(1)银行家算法流程图《操作系统原理》实验报告-3-运行结果如图(2)(3)所示:图(2)图(3)银行家算法截图七、实验心得与体会银行家算法是操作系统中避免死锁的典型算法。所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。通过这次实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁。在实验中,难免会遇到问题,通过自己在网上查找资料、询问同学,这些问题都得到了解决,完成了本次《操作系统原理》实验报告-4-实验。通过这次的实验,使我的理论知识更加的牢固。附录#includeiostream.h#includestring.h#includestdio.h#defineFalse0#defineTrue1intMax[100][100]={0};//各进程所需各类资源的最大需求intAvaliable[100]={0};//系统可用资源charname[100]={0};//资源的名称intAllocation[100][100]={0};//系统已分配资源intNeed[100][100]={0};//还需要资源intRequest[100]={0};//请求资源向量inttemp[100]={0};//存放安全序列intWork[100]={0};//存放系统可提供资源intM=100;//作业的最大数为100intN=100;//资源的最大数为100voidshowdata()//显示资源矩阵{inti,j;cout系统目前可用的资源[Avaliable]:endl;for(i=0;iN;i++)coutname[i];coutendl;for(j=0;jN;j++)coutAvaliable[j];//输出分配资源coutendl;coutMaxAllocationNeedendl;cout进程名;for(j=0;j3;j++){for(i=0;iN;i++)coutname[i];cout;}coutendl;for(i=0;iM;i++){couti;for(j=0;jN;j++)coutMax[i][j];cout;for(j=0;jN;j++)coutAllocation[i][j];cout;for(j=0;jN;j++)《操作系统原理》实验报告-5-coutNeed[i][j];coutendl;}}intchangdata(inti)//进行资源分配{intj;for(j=0;jM;j++){Avaliable[j]=Avaliable[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}return1;}intsafe()//安全性算法{inti,k=0,m,apply,Finish[100]={0};intj;intflag=0;Work[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2];for(i=0;iM;i++){apply=0;for(j=0;jN;j++){if(Finish[i]==False&&Need[i][j]=Work[j]){apply++;if(apply==N){for(m=0;mN;m++)Work[m]=Work[m]+Allocation[i][m];//变分配数Finish[i]=True;temp[k]=i;i=-1;k++;flag++;}}}}for(i=0;iM;i++){if(Finish[i]==False){cout系统不安全endl;//不成功系统不安全return-1;}}《操作系统原理》实验报告-6-cout系统是安全的!endl;//如果安全,输出成功cout分配的序列:;for(i=0;iM;i++){//输出运行进程数组couttemp[i];if(iM-1)cout-;}coutendl;return0;}voidshare()//利用银行家算法对申请资源对进行判定{charch;inti=0,j=0;ch='y';cout请输入要求分配的资源进程号(0-M-1):;cini;//输入须申请的资源号cout请输入进程i申请的资源:endl;for(j=0;jN;j++){coutname[j]:;cinRequest[j];//输入需要申请的资源}for(j=0;jN;j++){if(Request[j]Need[i][j])//判断申请是否大于需求,若大于则出错{cout进程i申请的资源大于它需要的资源;cout分配不合理,不予分配!endl;ch='n';break;}else{if(Request[j]Avaliable[j])//判断申请是否大于当前资源,若大于则{//出错cout进程i申请的资源大于系统现在可利用的资源;cout分配出错,不予分配!endl;ch='n';break;}}}if(ch=='y'){changdata(i);//根据进程需求量变换资源showdata();//根据进程需求量显示变换后的资源safe();//根据进程需求量进行银行家算法判断}}《操作系统原理》实验报告-7-voidaddresources(){//添加资源intn,flag;cout请输入需要添加资源种类的数量:;cinn;flag=N;N=N+n;for(inti=0;in;i++){cout名称:;cinname[flag];cout数量:;cinAvaliable[flag++];}showdata();safe();}voiddelresources(){//删除资源charming;inti,flag=1;cout请输入需要删除的资源名称:;do{cinming;for(i=0;iN;i++)if(ming==name[i]){flag=0;break;}if(i==N)cout该资源名称不存在,请重新输入:;}while(flag);for(intj=i;jN-1;j++){name[j]=name[j+1];Avaliable[j]=Avaliable[j+1];}N=N-1;showdata();safe();}voidchangeresources(){//修改资源函数cout系统目前可用的资源[Avaliable]:endl;for(inti=0;iN;i++)coutname[i]:Avaliable[i]endl;cout输入系统可用资源[Avaliable]:endl;cinAvaliable[0]Avaliable[1]Avaliable[2];《操作系统原理》实验报告-8-cout经修改后的系统可用资源为endl;for(intk=0;kN;k++)coutname[k]:Avaliable[k]endl;showdata();safe();}voidaddprocess(){//添加作业intflag=M;M=M+1;cout请输入该作业的最打需求量[Max]endl;for(inti=0;iN;i++){coutname[i]:;cinMax[flag][i];Need[flag][i]=Max[flag][i]-Allocation[flag][i];}showdata();safe();}intma