操作系统银行家算法.docx
- 文档编号:4268897
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:15
- 大小:251.44KB
操作系统银行家算法.docx
《操作系统银行家算法.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统银行家算法
《操作系统》课程设计报告
院系计算机与信息工程学院
题目模拟银行家算法实现死锁避免
学生姓名
学生学号2009
专业班级软件工程2班
指导教师
完成时间2012年1月10日
目录
1.需求分析----------------------------------------------3
2概要设计----------------------------------------------4
3详细设计----------------------------------------------6
4测试--------------------------------------------------7
5运行结果----------------------------------------------8
结论-----------------------------------------------------11
参考文献--------------------------------------------------12
附录-----------------------------------------------------13
1需求分析
模拟实现银行家算法实现死锁避免的目的和要求:
在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高自身通过编程根据已有原理解决实际问题的能力,为将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
实验原理分析:
(1)算法的来源和基本思想
银行家算法,顾名思义是来源于银行的借贷业务,通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
一定数量的本金要应多个客户的借贷周转,为了防止银行资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
(2)死锁产生的条件
银行家算法是用来避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件:
A、即一个资源每次只能由一个进程使用;
B、第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;
C、第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;
D、第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
银行家算法是避免死锁的方法中,施加的限制条件较弱的,有利于获得令人满意的系统性能的方法。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
(3)模拟进程申请资源
把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,,每个进程的资源需求总量不能超过系统拥有的资源总数,银行算法进行资源分配可以避免死锁.
2概要设计
银行家算法课分为两个主要的功能模块,其描述如下:
1.初始化
由用户输入数据,分别对运行的进程数,总的资源种数,总资源数,各进程所需要的最大资源数量和已分配的资源数量进行赋值。
2.安全性检查算法
(1)设置两个向量
工作向量:
Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
Finish:
表示系统是否有足够资源分配给进程(True:
有;False:
没有).初始化为False
(2)若Finish[i]=false<=Work,则执行3;否则执行4(i为资源类别)
(3)进程P获得第i类资源,则顺利执行直至完成,并释放资源:
Work=Work+Available;Finish[i]=true;转
(2)
3.银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程j提出请求REQUEST[i],则银行家算法按如下规则进行判断。
(1).如果REQUEST[j][i]<=NEED[j][i],则转
(2);否则,出错。
(2).如果REQUEST[j][i]<=AVAILABLE[j][i],则转(3);否则,出错。
(3).系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[j][i];
ALLOCATION[j][i]+=REQUEST[j][i];
NEED[j][i]-=REQUEST[j][i];
用到的数据结构:
实现银行家算法要有若干数据结构,它们用来表示资源分配系统的状态。
令n表示系统中进程的数目,m表示资源的分类数。
还需要以下数据结构:
1).Available是一个长度为m的向量,它表示每类资源可用的数量。
Available[j]=k,表示j类资源可用的数量为k。
2).Max是一个n×m矩阵,它表示每个进程对资源的最大需求。
Max[i,j]=k,表示进程pi至多可以申请k个j类资源单位。
3).Allocation是一个n×m矩阵,它表示当前分给每个进程的资源数目。
Allocation[i,j]=k,表示进程i当前分到k个j类资源。
4).Need是一个n×m矩阵,它表示每个进程还缺少多少资源。
Need[i,j]=k,表示进程pi尚需k个j类资源才能完成其任务。
显然Need[i,j]=Max[i,j]-Allocation[i,j]。
3详细设计
1主函数main()
运行主函数,出现程序的图形界面,用户可在其上面分别输入进程的个数,资源种类,每个进程已经分配的资源数,和每个进程所需要的最大资源数目,最后,输入各种资源当前可利用的资源数目,输入完毕,程序会计算该系统的状态是否安全。
2函数initTableData()
函数initTableData主要是对界面上显示出来的表格进行初始化,包括确定进程的数量和资源的种类,已经对初次显示的表格进行初始化,还有对其中用Vector封装的数据进行初始化给予赋值。
3函数getFreshData()
函数getFreshData主要是对用户输入表格的数据进行获取,然后对每个进程进行判断,判断当前各种所剩余的资源是否能够满足该进程,若满足,则对FINISH赋值为true,同时获得该进程的进程号,如果所有进程都被满足,最后就把数据按进程号进行排序,以获得最终的安全序列,重新用Vector进行封装,再次初始化表格。
4函数showResultData()
函数showResultData主要是对当前系统是否处于安全状态给予用户一个提示,通过函数getFreshData能够知道,当前系统是否处于安全状态,showResultData通过一个参数获得是否安全的一个结果,然后把该结果给予用户一个通知。
4测试
在测试中,该程序出现停止在一个地方不能继续运行的问题。
问题的原因:
用户在输入数据中,错误的把数字输入成了字母。
如图4.1
图4.1用户输入错误
解决办法:
对要求输入的数据进行异常捕获,如果程序发现输入的数据不正确,则会给用户一个提示,要求其重新输入。
如图4.2
图4.2提示用户重新输入
5运行结果
程序运行后,首先输入进程数,其次是资源种数,点击OK按钮,然后输入进程所需各资源的最大数量,和进程已分配的各资源的数量,和当期可利用的资源数量,具体结果,请看图片。
图5.1输入进程数和资源种类
图5.2输入数据
图5.3通知系统状态
图5.4系统的安全序列
图5.5系统不安全
结论
在本次课程设计中,遇到了很多问题,比如表格数据如何进行初始化啊,在一个面板中如何添加表格,如何通过一个按钮实现表格中数据的更新,没有对用户的输入进行异常捕获等,通过查阅资料,知道了用Vector对表格中的数据进行封装,通过更新表格的模型中的数据来更新表格中的内容,使用showMessageDialog函数来提示用户输入有误,在这个找错误的过程中,不知不觉的就会学的很多新东西,为了一个表格的数据封装,查阅了很多资料,这其中有很多以前没有接触到的知识,这就扩大了我的知识面,当一个问题,完全靠着自己的努力而解决的时候,收获到的不仅仅是知识,还有一种力量,那种自信的力量,这会让我想继续挑战下一个问题,第一次课程设计的时候,老师要求我们写文档,需求分析啊,系统测试啊,项目管理啊等等,那时候觉得写这么多没用的纸上的东西干什么啊,而且又什么都不明白。
现在又一次的写文档,突然才明白,有些东西,写多了自然就会有经验,有收获的。
在本程序设计中,我深深的感受到一个程序的总体设计是多么的重要了,以前写的小程序都是想到哪写到哪,无论怎样都能搞定,这次因为设计了图形界面,虽然说程序也不是很大,但因为当初考虑的不周全,导致最后,不得不通过删减程序功能,来达到完成任务的目的。
参考文献
1Peter,郑扣根(译).操作系统概念.高等教育出版社,2007
2叶核亚,Java程序设计使用教程.电子工业出版社,2009
附录:
程序主要代码:
publicvoidinitTableData(){
tb=newJTable();
sp=newJScrollPane();
//sp.setBounds(12,25,452,402);
sp.setBounds(30,120,470,300);
sp.setViewportView(tb);
/************setDATA*************************/
//设置列明
titles=newVector
//************获得资源种类**************************************//
Stringrkc=rkcText.getText();
try{
rk=Integer.parseInt(rkc);
}catch(ExceptionEE){JOptionPane.showMessageDialog(this,"资源种类输入错误");}
//资源名
Stringrn[]=newString[rk];
titles.add("进程\\资源");
for(inti=0;i { rn[i]=String.valueOf((char)(65+i)); titles.add(rn[i]); } for(intk=0;k<3;k++) for(intj=0;j { titles.add(rn[j]); } titles.add("Finish"); /***获得表行的名字,即进程的名字***************************************/ Stringpc=pcText.getText(); try{ pCount=Integer.parseInt(pc); }catch(ExceptionEE){JOptionPane.showMessageDialog(this,"进程数量输入有误");} //设置行标题就是第一列的值 row=newVector[pCount]; Stringpn[]=newString[pCount];//各进程的名字 inti=0; for(i=0;i { pn[i]="p"+i; row[i]=newVector(); row[i].add(pn[i]); } //设置行的数据 Vectordata=newVector(); for(intj=0;j { for(intk=0;k row[j].add(""); data.add(row[j]); } dtm=newDefaultTableModel(data,titles); this.tb.setModel(dtm); /****************setDATA*************************/ bgPan.add(sp); } publicvoidgetFreshData() { dtm.fireTableStructureChanged(); StringstrData[][]=newString[pCount][rk*4+1];//存储table中编辑后的数据 data=newint[pCount][rk*4];//存储已分配和进程最大需求资源数据 intneed[][]=newint[pCount][rk];//临时存放进程当前需要的资源数 intavailable[]=newint[rk];//存储可利用资源 FINISH=newboolean[pCount];// temp=newint[pCount];//存放临时安全的进程号 inti=0,j=0,m=0,k=0; for(i=0;i {//把表格中的数据取出,存到data数组中 if(i==0) for(j=1;j { strData[i][j-1]=(String)dtm.getValueAt(i,j); try{ data[i][j-1]=Integer.parseInt(strData[i][j-1]); }catch(ExceptionEE){JOptionPane.showMessageDialog(this,"请输入正确的数字");} //System.out.println("data="+data[i][j-1]); } else for(j=1;j { strData[i][j-1]=(String)dtm.getValueAt(i,j); data[i][j-1]=Integer.parseInt(strData[i][j-1]); } } //把可利用资源存放到available数组中 for(i=0;i { available[i]=data[0][2*rk+i]; } //计算进程目前还需要的各资源数目并将结果存储到need数组中 for(i=0;i for(j=0;j { need[i][j]=data[i][rk+j]-data[i][j]; data[i][j+rk*2]=need[i][j]; } //依次比较所需资源和可利用资源,找出可利用资源能够满足的进程 for(i=0;i FINISH[i]=false; i=0; while(i for(k=0;k { if(need[i][k]>available[k]) { break; } } if(k==rk&&FINISH[i]==false) { temp[m]=i; m++; FINISH[i]=true; for(k=0;k { data[i][k+3*rk]=data[i][k]+available[k]; available[k]=data[i][k+3*rk]; } i=0; } else i++; } } publicvoidshowResultData() { inti=0,j=0; /************获得资源种类************************************** ***获得表行的名字,即进程的名字***************************************/ Stringpc=pcText.getText(); pCount=Integer.parseInt(pc); //System.out.println(pCount); //设置行标题就是第一列的值 row=newVector[pCount]; Stringpn[]=newString[pCount];//各进程的名字 //设置行的数据 Vectordata1=newVector(); booleanRESULT=false; for(j=0;j { for(i=0;i if(FINISH[i]==false) { break; } if(i==pCount) { RESULT=true; } //data1.add(row[j]); } if(RESULT==true) { for(i=0;i { pn[i]="p"+temp[i]; row[i]=newVector(); row[i].add(pn[i]); } JOptionPane.showMessageDialog(this,"恭喜! 系统处于安全状态"); for(j=0;j { for(intk=0;k { row[j].add(String.valueOf(data[temp[j]][k])); } row[j].add("true"); data1.add(row[j]); } } else { for(i=0;i { pn[i]="p"+i; row[i]=newVector(); row[i].add(pn[i]); } JOptionPane.showMessageDialog(this,"很抱歉,系统处于不安全状态"); for(j=0;j { for(intk=0;k { row[j].add(String.valueOf(data[j][k])); } //row[j].add("true"); data1.add(row[j]); } } dtm=newDefaultTableModel(data1,titles); this.tb.setModel(dtm); /****************setDATA*************************/ bgPan.add(sp); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 银行家 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)