《银行家算法 实验报告》由会员分享,可在线阅读,更多相关《银行家算法 实验报告(13页珍藏版)》请在金锄头文库上搜索。
1、淮海工学院计算机工程学院实验报告书课程名:操作系统原理题 目:银行家算法班 级:学号:姓名:一、实验目的银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步 骤和相关数据结构用法的更好理解。实验环境Turbo C 2.0/3。0 或 VC+6。0实验学时4学时,必做实验。二、实验内容用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形.进程可动态地申请资源,系统按各进程的申请动 态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列; 显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资
2、源数据 的情况.三、实验说明实验中进程的数量、资源的种类以及每种资源的总量Totals最好允许动态指定。 初始时每个进程运行过程中的最大资源需求量Maxi,j和系统已分配给该进程的资源 量Allocation i, j均为已知(这些数值可以在程序运行时动态输入),而算法中其他 数据结构的值(包括Needi,j、Available j)则需要由程序根据已知量的值计算产生。四、实验步骤1、理解本实验中关于两种调度算法的说明。2、根据调度算法的说明,画出相应的程序流程图。3、按照程序流程图,用 C 语言编程并实现。五、分析与思考1要找出某一状态下所有可能的安全序列,程序该如何实现?答:要找出这个状态
3、下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而 系统的状态可通过以下来描述:进程剩余申请数=最大申请数-占有数; 可分配资源数=总数占有数之和; 通过这个描述来算出系统是否安全,从而找出所有的安全序列.2银行家算法的局限性有哪些?答:银行家算法是一种最有代表性的避免死锁的算法。银行家算法即把操作系统看作是银行 家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行 家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程 对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否 则就
4、推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统 现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟 分配。但任何一种算法都存在其缺点,对各进程的资源分配要求严格,经常使其处于不安全状态, 银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。六、测试数据与实验结果银行家算法流程图(1)所示:图(1)银行家算法流程运行结果如图(2) (3)所示:可Ti:hcn=c2需求:i: S3 醉 Hax 1 =图(2)图(3)
5、银行家算法截图7 S 1b 2 3b 0 22 2 24 3 3请输入各进程已经申诗的 O fl 1M .2 aton 3 ;W 1 0h 0 03 0 22 1 1BOZ系圻目前可用的IftvaliablcJsa Jj c3 3 2七、实验心得与体会银行家算法是操作系统中避免死锁的典型算法。所谓死锁:是指两个或两个以上的进程在执行 过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称 系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程由于资源占用是 互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无
6、 法继续运行,这就产生了一种特殊现象死锁。通过这次实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁在实验中, 难免会遇到问题,通过自己在网上查找资料、询问同学,这些问题都得到了解决,完成了本次实验。操作系统原理实验报告-4 - 通过这次的实验,使我的理论知识更加的牢固。附录#includeiostream。h#includestring.h #includestdio.hdefine False 0define True 1int Max100100= 0;/各进程所需各类资源的最大需求 int Avaliable 100 = 0;/系统可用资源char name 100 =
7、 0 ;/资源的名称int Allocation 100 100 = 0;/系统已分配资源 int Need 100 100 = 0; /还需要资源int Reques t 100 = 0;/请求资源向量int temp 100 = 0 ;/存放安全序列int Work100 = 0 ; /存放系统可提供资源int M=100; /作业的最大数为100int N=100; /资源的最大数为100void showda ta()/显示资源矩阵int i,j;cout”系统目前可用的资源Avaliable: endl; for(i=0;iN;i+)coutnamei” ”; coutendl;fo
8、r (j=0;jN;j+) coutAvaliablej ;/输出分配资源 coutendl;endl;coutMaxAllocation Need”cout进程名;for(j=0;j3;j+) for(i=0;iN;i+)coutnamei” ”; cout;coutendl; for(i=0;iM;i+)cout” ”i”;for(j=0;jN;j+)coutMaxij” ”; cout;for(j=0;jN;j+) coutAllocationij” ”;cout;for(j=0;jN;j+)coutNeedij” ;coutendl;int changdata(int i) /进行资源
9、分配int j;for (j=0;jM;j+) Avaliablej=AvaliablejRequestj;Allocationij=Allocationij+Requestj;Needij=Needij-Requestj;return 1;int safe()/安全性算法int i,k=0,m,apply,Finish100=0;int j;int flag=0;Work0=Avaliable0;Work1=Avaliable1;Work2=Avaliable2;for(i=0;iM;i+)apply=0;for(j=0;jN;j+)if(Finishi=FalseNeedij=Workj)
10、apply+;if(apply=N)for(m=0;mN;m+)Workm=Workm+Allocationi m;/变分配数Finishi=True;tempk=i;i=1;k+;flag+;for(i=0;iM;i+)if(Finishi=False)cout系统不安全endl;/不成功系统不安全return -1;cout系统是安全的!endl; /如果安全,输出成功 cout”分配的序列:;for(i=0;iM; i+) /输出运行进程数组couttempi;if(iM1) cout-”;coutendl;return 0;void share() /利用银行家算法对申请资源对进行判定
11、char ch;int i=0,j=0;ch=y;cout”请输入要求分配的资源进程号(0”M-l”):”;cini; /输入须申请的资源号cout请输入进程i”申请的资源:”endl;for(j=0;jN;j+)coutnamej:;cinRequestj; /输入需要申请的资源for (j=0;jN;j+)if(RequestjNeedi j) /判断申请是否大于需求,若大于则出错 cout进程i”申请的资源大于它需要的资源; cout分配不合理,不予分配!”endl;ch=n; break;elseif (Request jAvaliable j) /判断申请是否大于当前资源,若大于则
12、/出错cout进程i”申请的资源大于系统现在可利用的资源;cout”分配出错,不予分配!”endl; ch=n;break;if(ch=y)changdata(i); /根据进程需求量变换资源showdata(); /根据进程需求量显示变换后的资源safe () ;/根据进程需求量进行银行家算法判断void addresources () /添加资源int n,flag;cout请输入需要添加资源种类的数量:”;cinn;flag=N;N=N+n;for(int i=0;in;i+)cout名称:”;cinnameflag;cou t ”数量:;cinAvaliableflag+;showda
13、ta(); safe();void delresources () /删除资源char ming;int i,flag=1;cout请输入需要删除的资源名称:”;docinming;for(i=0;iN;i+)if(ming=namei)flag=0;break;if(i=N)cout”该资源名称不存在,请重新输入:”;while(flag);for(int j=i;jN1;j+)namej=namej+1;Avaliablej=Avaliablej+1;N=N1;showdata();safe();void changeresources () /修改资源函数cout”系统目前可用的资源Avaliable: ”endl;for(int i=0;iN;i+) coutnamei”:Avaliableiendl; cout” 输入系统可用资源Avaliable:endl; cinAvaliable0Avaliable1