1、淮海工学院计算机工程学院实验报告书课程名: 操作系统原理 题 目: 银行家算法 班 级: 学 号: 姓 名: 评语:成绩: 指导教师: 批阅时间: 年 月 日操作系统原理实验报告 - 9 -一、实验目的银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。实验环境Turbo C 2.0/3.0或VC+6.0实验学时4学时,必做实验。二、实验内容用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资
2、源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。三、 实验说明实验中进程的数量、资源的种类以及每种资源的总量Totalj最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Maxi,j和系统已分配给该进程的资源量Allocationi,j均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Needi,j、Availablej)则需要由程序根据已知量的值计算产生。四、 实验步骤1、 理解本实验中关于两种调度算法的说明。2、 根据调度算法的说明,画出相应的程序流程图。3、 按照程序流程图,用C语言编程并实现。五、分
3、析与思考1 要找出某一状态下所有可能的安全序列,程序该如何实现?答:要找出这个状态下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而系统的状态可通过以下来描述:进程剩余申请数=最大申请数-占有数; 可分配资源数=总数-占有数之和;通过这个描述来算出系统是否安全,从而找出所有的安全序列。2 银行家算法的局限性有哪些?答:银行家算法是一种最有代表性的避免死锁的算法。银行家算法即把操作系统看作是银行 家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求
4、量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。但任何一种算法都存在其缺点,对各进程的资源分配要求严格,经常使其处于不安全状态,银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。六、测试数据与实验结果银行家算法流程图(1)所示:结束 否是申请失败。以上分配作废,恢复原来的分配状态:A
5、vailablej = Availablej + RequestijAllocationij= AllocationijRequestijNeedij = Needij+RequestijNYNYRequestij Needij出错返回:return(error)Requestij Availablej出错返回:(进程阻塞)return(error)Availablej = Availablej RequestijAllocationij= Allocationij + RequestijNeedij = Needij Requestij假定分配:输入初始参数(资源分配及请求情况)开始 假定分
6、配之后,系统安全吗?申请成功。输出各种数据的变化图(1)银行家算法流程图运行结果如图(2)(3)所示:图(2)图(3)银行家算法截图七、实验心得与体会银行家算法是操作系统中避免死锁的典型算法。所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。通过这次实验,加深了我对银行家算法的了解,掌握了如何利用银行家
7、算法避免死锁。在实验中,难免会遇到问题,通过自己在网上查找资料、询问同学,这些问题都得到了解决,完成了本次实验。通过这次的实验,使我的理论知识更加的牢固。附录#include#include#include#define False 0#define True 1int Max100100=0;/各进程所需各类资源的最大需求int Avaliable100=0;/系统可用资源char name100=0;/资源的名称int Allocation100100=0;/系统已分配资源int Need100100=0;/还需要资源int Request100=0;/请求资源向量int temp100=
8、0;/存放安全序列int Work100=0;/存放系统可提供资源int M=100;/作业的最大数为100int N=100;/资源的最大数为100void showdata()/显示资源矩阵 int i,j; cout系统目前可用的资源Avaliable:endl; for(i=0;iN;i+) coutnamei ; coutendl; for (j=0;jN;j+) coutAvaliablej ;/输出分配资源 coutendl; cout Max Allocation Needendl; cout进程名 ; for(j=0;j3;j+) for(i=0;iN;i+) coutnam
9、ei ; 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)/进行资源分配 int j;for (j=0;jM;j+) Avaliablej=Avaliablej-Requestj; Allocationij=Allocationij+Requestj; Needij=Needij-Requestj;
10、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=False&Needij=Workj) apply+; if(apply=N) for(m=0;mN;m+) Workm=Workm+Allocationim;/变分配数 Finishi=True; tempk=i; i=-1; k+; flag+;
11、for(i=0;iM;i+) if(Finishi=False) cout系统不安全endl;/不成功系统不安全 return -1; cout系统是安全的!endl;/如果安全,输出成功 cout分配的序列:;for(i=0;iM;i+)/输出运行进程数组 couttempi; if(iM-1) cout; coutendl; return 0;void share()/利用银行家算法对申请资源对进行判定char ch;int i=0,j=0;ch=y;cout请输入要求分配的资源进程号(0-M-1i;/输入须申请的资源号cout请输入进程 i 申请的资源:endl;for(j=0;jN;j
12、+) coutnamejRequestj;/输入需要申请的资源 for (j=0;jNeedij)/判断申请是否大于需求,若大于则出错 cout进程 i申请的资源大于它需要的资源; cout 分配不合理,不予分配!Avaliablej)/判断申请是否大于当前资源,若大于则 /出错 cout进程i申请的资源大于系统现在可利用的资源; cout 分配出错,不予分配!endl; ch=n; break; if(ch=y) changdata(i);/根据进程需求量变换资源 showdata();/根据进程需求量显示变换后的资源 safe();/根据进程需求量进行银行家算法判断 void addres
13、ources()/添加资源 int n,flag;coutn;flag=N;N=N+n;for(int i=0;in;i+) coutnameflag; coutAvaliableflag+;showdata();safe();void delresources()/删除资源char ming;int i,flag=1;coutming;for(i=0;iN;i+) if(ming=namei) flag=0; break; if(i=N) cout该资源名称不存在,请重新输入:;while(flag);for(int j=i;jN-1;j+) namej=namej+1; Avaliable
14、j=Avaliablej+1; N=N-1;showdata();safe();void changeresources()/修改资源函数cout系统目前可用的资源Avaliable:endl; for(int i=0;iN;i+) coutnamei:Avaliableiendl;cout输入系统可用资源Avaliable:Avaliable0Avaliable1Avaliable2;cout经修改后的系统可用资源为endl;for (int k=0;kN;k+) coutnamek:Avaliablekendl;showdata();safe();void addprocess()/添加作
15、业 int flag=M;M=M+1;cout请输入该作业的最打需求量Maxendl;for(int i=0;iN;i+) coutnameiMaxflagi; Needflagi=Maxflagi-Allocationflagi;showdata();safe();int main()/主函数 int i,j,number,choice,m,n,flag;char ming;cout*单处理机系统进程调度实现*endl;coutn;N=n;for(i=0;in;i+) cout资源i+1ming; namei=ming; coutnumber; Avaliablei=number;coute
16、ndl;coutm;M=m;cout请输入各进程的最大需求量(m*n矩阵)Max:endl;for(i=0;im;i+) for(j=0;jMaxij;do flag=0; cout请输入各进程已经申请的资源量(m*n矩阵)Allocation:endl; for(i=0;im;i+) for(j=0;jAllocationij; if(AllocationijMaxij) flag=1; Needij=Maxij-Allocationij; if(flag) cout申请的资源大于最大需求量,请重新输入!n;while(flag); showdata();/显示各种资源 safe();/用银
17、行家算法判定系统是否安全 while(choice) cout*银行家算法演示*endl; cout 1:增加资源 endl; cout 2:删除资源 endl; cout 3:修改资源 endl; cout 4:分配资源 endl; cout 5:增加作业 endl; cout 0:离开 endl; cout*endl; coutchoice; switch(choice) case 1: addresources();break; case 2: delresources();break; case 3: changeresources();break; case 4: share();break; case 5: addprocess();break; case 0: choice=0;break; default: cout请正确选择功能号(0-5)!endl;break; return 1;