操作系统课程实验报告学生姓名:孔令周学号:20101002021班级:116102指导教师:徐占亚中国地质大学信息工程学院2012年5月28日实习题目:银行家算法设计实现【需求规格说明】对I/O系统的死锁资源的问题的解决主要的方法是银行家算法,单种资源的银行家算法和多种资源的银行家算法的解决思路一致,要求设计实现多种银行家算法,并要求所涉及的模型最少更够满足如下要求:(1)程序能够根据进程的请求进行判断,给出系统是否安全的的提示,如果安全,要求能够显示一组进程执行的安全序列;(2)能够根据需要,显示当前系统中各种资源的分配情况;【算法设计】(1)设计思想:察看仍然需要的资源矩阵中,是否存在这样一个序列(p1,p2,p3……pn),如果进程按照这个顺序执行的话每个进程都可以得到他所需要的资源进而结束运行,则称这个进程表不会发生死锁,否则就会发生死锁。(2)设计表示:否否是(3)详细设计表示:1.查看进程仍需资源矩阵中是否有一行,其未被满足的设备数均小于或等于剩余向量A。如果找不到则系统将发生死锁,任何进程都无法运行结束。2.若找到这样的一行,则可以假设他获得所需要的资源并且运行结束,将该进程标记为结束,并将资源加到向量A上。3.重复以上两个步骤,直到所有的进程都标记为结束。若达到所有的进程都结束,则状态时安全的,否则将发生死锁。【调试报告】1.没有将已经申请的资源释放。我调试的时候发现怎么输入正确的数据的时候怎么出来的也是不安全的警告。跟着调试也看不错来步骤中那个变量出错,结果就跟到理论状态,如果想开始想的那样的话就不是银行检查第一行是否小于A死锁检查下一行是否结束?安全家算法,反过来,如果银行家算法是我想的那样的话就不是可以解决问题的方法了。解决方法自然是吧书上的步骤重新看一下,问题自然就迎刃而解。2.在判断是否为安全状态之后不管是否安全要把矩阵还原,开始的时候所有的操作都是在原来的矩阵中操作的,如果在检测阶段做了判断之后,数据就已经变了,在做打印结果的时候就可能出现错误,解决方法是将资源矩阵备份,判断的时候用的是备份的那一份,而最后打印的时候是用的原矩阵。3.由于我做的时候没有看到一句话“把可获得资源的进程标记为结束”,所以我没有标记矩阵,于是我不能再检查完这一行矩阵之后继续检查下面的一行,而是将那一行删除,从头开始在一个个查找是否能够在找到这样的一行。这里就引入了goto语句,事实上这是我第一次使用goto语句。控制上话了一点功夫,确实会发生死循环的危险。但是控制的好还是可以解决的,主要的问题是一定要让goto能够出去。【用户手册】用户需配备VS2010或更高版本配置的C#编辑环境以成功运行该程序。用户根据界面上面的选项进行选择要申请的资源名和大小。用户申请资源或者打印结果,然后点击结束推出程序。该程序在Win7系统,Vs2010下运行无误【附录】检测申请后是否安全安全结果【代码】usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceBanker{publicpartialclassForm1:Form{//公?共2数ºy据Y定¡§义°?int[]rest=newint[]{1,0,2,0};int[,]given=newint[5,4];//已°?分¤?配?资Á¨º源¡äint[,]need=newint[5,4];//仍¨?需¨¨要°a的Ì?资Á¨º源¡äint[]array_need=new[]{1,1,0,0,0,1,1,2,3,1,0,0,0,0,1,0,2,1,1,0};int[]array_given=newint[]{3,0,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0};int[]temp_rest=newint[4];int[,]temp_need=newint[5,4];int[,]source_tatle=newint[5,4];//申¦¨º请?模¡ê块¨¦数ºy据Y定¡§义°?stringstr_getProcess;stringstr_getResource;stringstr_getNumber;intprocessno;intresourceno;intnumberno;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){//comobox的Ì?值¦Ì定¡§义°?string[]comboxstrprocess=newstring[]{A,B,C,D,E};combo_process.DataSource=comboxstrprocess;string[]comboxstrsource=newstring[]{磁ä?带ä?机¨²,绘?图ª?仪°?,打䨰印®?机¨²,CD-ROM};combo_resource.DataSource=comboxstrsource;//已°?分¤?配?资Á¨º源¡ä矩?阵¨®和¨ª仍¨?需¨¨要°a资Á¨º源¡ä矩?阵¨®的Ì?赋3值¦Ì语®?句?intindex=0;for(inti=0;i5;i++){for(intj=0;j4;j++){need[i,j]=array_need[index];given[i,j]=array_given[index];source_tatle[i,j]=need[i,j]+given[i,j];index++;}}for(inta=0;a4;a++){temp_rest[a]=rest[a];//将?rest【?】?备À?份¤Y,ê?以°?免a破?坏¦Ì}for(inti=0;i5;i++){for(intj=0;j4;j++){temp_need[i,j]=need[i,j];}}}privatevoidcombo_resource_SelectedIndexChanged(objectsender,EventArgse){string[]comboxstrnumbe;if(combo_resource.SelectedIndex==0){comboxstrnumbe=newstring[]{1};}elseif(combo_resource.SelectedIndex==1){comboxstrnumbe=newstring[]{0};}elseif(combo_resource.SelectedIndex==2){comboxstrnumbe=newstring[]{1,2};}else{comboxstrnumbe=newstring[]{0};}combo_number.DataSource=comboxstrnumbe;}privatevoidbutton2_Click(objectsender,EventArgse){this.Close();}privatevoidApply_Click(objectsender,EventArgse){//数ºy据Y赋3值¦Ìstr_getProcess=combo_process.Text;str_getResource=combo_resource.Text;str_getNumber=combo_number.Text;switch(str_getProcess){caseA:processno=0;break;caseB:processno=1;break;caseC:processno=2;break;caseD:processno=3;break;caseE:processno=4;break;default:processno=-1;MessageBox.Show(str_getProcessERROR);break;}switch(str_getResource){case磁ä?带ä?机¨²:resourceno=0;break;case绘?图ª?仪°?:resourceno=1;break;case打䨰印®?机¨²:resourceno=2;break;caseCD-ROM:resourceno=3;break;default:resourceno=-1;MessageBox.Show(str_getResourceERROR);break;}switch(str_getNumber){case0:numberno=0;break;case1:numberno=1;break;case2:numberno=2;break;default:numberno=-1;MessageBox.Show(str_getNumberERROR);break;}temp_rest[resourceno]-=numberno;temp_need[processno,resourceno]-=numberno;//重?新?判D断?是º?否¤?安ã2全¨?int[]temp=newint[4];intis_safe=0;//每?一°?个?进?程¨¬是º?否¤?为a安ã2全¨?状Á¡ä态¬?intfinish=0;//进?行D五?次ä?循-环¡¤判D断?是º?否¤?五?个?进?程¨¬可¨¦以°?全¨?部?为a安ã2全¨?状Á¡ä态¬?,ê?为a五?是º?为a安ã2全¨?状Á¡ä态¬?while(finish5){for(intindex_i=0;index_i5;index_i++){for(intindex_j=0;index_j4;index_j++){temp[index_j]=temp_need[index_i,index_j];if(index_j==3){if(temp[0]=temp_rest[0]&&temp[1]=temp_rest[1]&&temp[2]=temp_rest[2]&&temp_rest[3]=rest[3]){//MessageBox.Show(可¨¦能¨¹为a安ã2全¨?状Á¡ä态¬?!ê?);/*temp_rest[0]+=temp[0];temp_rest[1]+=temp[1];temp_rest[2]+=temp[2];temp_rest[3]+=temp[3];*/is_safe++;}}}}finish++;}if(is_safe!=5){MessageBox.Show(不?安ã2全¨?状Á¡ä态¬?);//如¨?果?为a不?安ã2全¨?状Á¡ä态¬?会¨¢撤¡¤销¨²原-申¦¨º请?temp_rest[resourceno]+=numberno;temp_need[processno,resourceno]+=numberno;}if(is_safe==5){MessageBox.Show(安ã2全¨?状Á¡ä态¬?!ê?);}}privatevoidLook_Click(objectsender,EventArgse){int[]tempofneed=newint[4];int[]tempofgiven=newint[4];intis_safe=0;//每?一°?个?进?程¨¬是º?否¤?为a安ã2全¨?状Á¡ä态¬?intfinish=0;//进?行D五?次ä?循-环¡¤判D断?是º?否¤?五?个?进?程¨¬可¨¦以°?全¨?部?为a安ã2全¨?状Á¡ä态¬?,ê?为a五?是º?为a安ã2全¨?状Á¡ä态¬?while(finish5){for(intindex_i=0;index_i5;index_i++){for(intindex_j=0;index_j4;index_j++){tempofneed[index_j]=temp_