《操作系统-实验四(共8页).doc》由会员分享,可在线阅读,更多相关《操作系统-实验四(共8页).doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验四 银行家算法(一)教学要求掌握处理死锁的方法,掌握银行家算法的实现(二)知识点提示死锁的概念,死锁产生的原因和条件,处理死锁的方法,银行家算法,安全状态和不安全状态,安全性算法(三)教学内容银行家算法的模拟实现实验步骤:(1)定义数据结构:allocation; /分配矩阵available; /可用资源向量need; /需求矩阵request; /资源请求向量(2)定义函数:void bank_arithmetic(int i, int request) /银行家算法 void isSafe( ); /安全性算法 主函数中对可用资源向量,分配矩阵和需求矩阵进行
2、初始化(输入数据参照课本P113的例题),输入请求资源的进程编号以及请求的资源向量,通过调用银行家算法判断是否可以把资源分配给请求资源的进程。(3)银行家算法的执行步骤:设Requesti是进程Pi的请求向量。若Requestij=k,表示进程Pi需要k个j类资源。当Pi发出资源请求后,系统按下述步骤进行检查: 若RequestiNeedi ,则转;否则,认为出错。因为它所需要的资源数已超过它所宣布的最大值。 若RequestiAvailable,则转;否则,表示系统中尚无足够的资源,Pi必须等待。 系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值。 Available=Avai
3、lable Requesti Allocationi = Allocationi + Requesti Needi = Needi Requesti 系统执行安全性算法,检测此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分给进程Pi;否则,将试探分配作废,恢复资源状态,让Pi等待。(4)安全性算法的执行步骤: 设置两个向量work和finish工作向量work,它表示系统可提供给进程继续运行的各类资源数,含有m个元素,其初始值为:workj=availablej。完成向量finish,它表示系统是否有足够资源使进程推进完成,开始执行安全性算法时,Finishi=false;当有足够
4、资源分配给进程Pi,Pi推进完成时,令Finishi=true。 从进程集合中找到一个进程,其满足: Finishi=false Needi,j Workj 如找到则执行步骤 ,找不到则执行步骤。 当进程Pi获得资源后,便可以向前推进,直至完 成,并释放出分配给它的全部资源,故应执行: Workj=Workj+Allocationi,j; Finishi=true; 执行步骤。 若所有进程的Finish都为true,则系统为安全状态;否则,系统为不安全状态。实验程序:#include #define M 3#define N 5int available=3,3,2;int allocatio
5、nNM=0,1,0,2,0,0,3,0,2,2,1,1,0,0,2;int needNM=7,4,3,1,2,2,6,0,0,0,1,1,4,3,1;void banker_arithmetic(int i,int request)int isSafe();int j,k,l;printf(进程P%d请求资源,资源请求向量为: n,i);for(j=0;jM;j+)printf(%d ,requestj);printf(n);j=0;while(j M)if(requestj=needij) j+;elsebreak;if(j=M)k=0;while(k M)if(requestk=needi
6、k)k+;elsebreak;if(k=M)for(l=0;lM;l+)availablel=availablel-requestl;allocationil=allocationil+requestl;needil=needil-requestl;if(isSafe()printf(分配是安全的,可以把资源分配给p%dn,i);elseprintf(分配是不安全的,不能把资源分配给P%dn,i);for(l=0;lM;l+)availablel=availablel+requestl;allocationil=allocationil-requestl;needil=needil+reque
7、stl;printf(Allocation:);for(j=0;jN;j+)for(k=0;kM;k+)printf(%d ,allocationjk); printf(n);printf(Need:);for(j=0;jN;j+)for(k=0;kM;k+)printf(%d ,needjk); printf(n);printf(Available:n);for(j=0;jM;j+)printf(%d ,availablej);printf(n);i+;int isSafe()int workM;int i,j,k,l=0,a=0;int finish=0,0,0,0,0;for(i=0;i
8、M;i+)worki=availablei;while(lN|a N) i=0;while(iN) if(finishi=0) j=0; while(jM) if(needij=workj) j+; else break; if(j=M) printf(P%d ,i); for(k=0;kM;k+) workk=workk+allocationik; printf(n); finishi=1; l+; i+;a+;for(i=0;iN;i+)if(finishi=0)return 0;return 1;int main()int i=1;int request=1,0,2; banker_ar
9、ithmetic(i,request);return 0;实验结果:进程p1请求资源,资源请求向量为:1 0 2p1p3p4p0p2分配是安全的,可以把资源分配给p1Allocation:0 1 03 0 23 0 22 1 10 0 2Need:7 4 30 2 06 0 00 1 14 3 1Available:2 3 0Press any key to continue.(四)思考题1、死锁产生的原因是什么?死锁产生的原因有竞争不可抢占型资源引起死锁 竞争可消耗资源引起死锁 进程推进顺序不当引发死锁2、处理死锁的方法有哪些?预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个。避免死锁:在系统的资源分配过程中,用某种方法去防止系统进入不安全状态(可能会导致思索的状态),从而避免发生死锁。检测和解除死锁:当进程申请资源时,不进行任何限制,即允许死锁发生。但要求系统定期或不定期检测是否有死锁发生。当检测到系统中已发生死锁时,将进程从死锁状态中解脱出来专心-专注-专业
限制150内