模拟银行家算法实现死锁避免.docx
《模拟银行家算法实现死锁避免.docx》由会员分享,可在线阅读,更多相关《模拟银行家算法实现死锁避免.docx(29页珍藏版)》请在冰豆网上搜索。
模拟银行家算法实现死锁避免
《操作系统》课程设计报告
院系:
计算机与信息工程学院
题目:
模拟银行家算法实现死锁避免
学生姓名:
学生学号:
专业班级:
指导教师:
完成时间:
2012年9月6日
评分表:
课题名称
指导教师
评语
成绩评定
姓名
成绩
学号
日期
年月日
目录
题目:
模拟银行家算法实现死锁避免1
评分表:
2
一课程设计目的3
二课程设计内容3
三课程设计环境4
四课程设计步骤4
41.需求分析4
4.1.1问题的提出4
4.1.2银行家算法原理4
4.1.3银行家算法详细解析5
4.1.4银行安全性算法目的6
4.2概要设计6
4.2.1功能模块设计如下:
6
4.2.2功能模块描述7
4.3详细设计7
4.3.1基本数据结构的设计7
4.3.2算法的设计8
五课程设计结果9
5.1运行结果9
5.2测试分析12
六课程设计心得与体会12
总结12
七参考文献13
八程序清单14
8.1操作主界面代码:
14
8.2功能实现代码:
17
一课程设计目的
在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
二课程设计内容
模拟实现银行家算法对系统资源进行分配,以防止死锁的出现。
本课题肯定不可能实现对实际操作系统的资源管理,而是通过对模拟资源数据的处理,检测银行家算法在防止死锁出现的作用。
银行家算法描述:
第一部分:
银行家算法(扫描)
1.如果Request<=Need,则转向2;否则,出错
2.如果Request<=Available,则转向3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:
安全性算法
1.设置两个向量
(1).工作向量:
Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:
表示系统是否有足够资源分配给进程(True:
有;False:
没有).初始化为False
2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(i为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:
Work=Work+Allocation;
Finish[i]=true;
转2
请充分理解以上银行家算法描述的核心思想。
(详细银行家算法描述见p95)
三课程设计环境
Windows操作系统java语言eclipse编程工具
四课程设计步骤
41.需求分析
4.1.1问题的提出
银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系银行家算法统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
为实现银行家算法,系统必须设置若干数据结构。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
4.1.2银行家算法原理
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2)顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
4.1.3银行家算法详细解析
1、安全性算法:
确定计算机系统是否处于安全状态的算法分为如下几步:
(1)设置两个工作向量Work=AVAILABLE;FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;Finish=true;GOTO2
(4)如所有的进程Finish=true,则表示安全;否则系统不安全。
2、资源请求算法:
设进程k提出请求request[i],则银行家算法按如下规则进行判断。
(1)如果request[k][i]<=need[k][i],则转
(2);否则,出错。
(2)如果request[k][i]<=avaliable[k][i],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
avaliable[i]-=request[k][i];avaliable[k][i]+=request[k][i];
need[k][i]-=request[k][i];
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
4.1.4银行安全性算法目的
银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
4.2概要设计
4.2.1功能模块设计如下:
图4.2.1:
程序功能模块设计图
4.2.2功能模块描述
第一部分:
银行家算法
1.如果Request<=Need,则转向2;否则,出错
2.如果Request<=Available,则转向3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:
安全性算法
1.设置两个向量
(1).工作向量:
Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:
表示系统是否有足够资源分配给进程(True:
有;False:
没有).初始化为False
2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(i为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:
Work=Work+Allocation;
Finish[i]=true;转2
4.3详细设计
4.3.1基本数据结构的设计
staticinttatoal[n];//总资源数
staticintavaliable[];//可利用资源数
staticintallocation[][];//已用资源数
staticintmax[][];//最大资源需求
staticintneed[][];//还需的各种资源数
staticintrequest[][];//请求资源数
4.3.2算法的设计
银行家安全性算法思路:
图4.3.2:
银行家安全性算法流程图
五课程设计结果
5.1运行结果
(1)主界面
图5.1-1:
操作主界面
(2)输入系统进程数为5、系统资源类型数为3
银行家算法算法演示结果如下:
图5.1-2:
实现主要功能界面
图5.1-3:
输入系统总资源数的表格
图5.1-4:
输入已用资源数的表格
图5.1-4:
输入最多资源输表格
图5.1-5:
输入请求资源数表格
图5.1-6:
系统安全状态检测
图5.1-7:
资源请求安全检测
5.2测试分析
经过几次测试下来,发现对于一些基本的操作已经没什么问题,但如果牵涉的复杂的问题,里面就出现了很多缺点和不足了。
从测试用的数据来看,基本上可以选择随意输入系统的进程数和系统的资源类型数以及系统每种资源的最大数量了,但由于测试的数据有限而且牵涉面也不是很广,很多问题可能没有测试出来,存在的一些技术问题还需要进一步改善。
六课程设计心得与体会
总结
操作系统课程设计下来,感觉自己有很大的进步,特别是在对操作系统相关知识的理解方面,许多在以前一直没有弄明白的地方,现在通过自己编写程序,一步步下来,一步步掌握了更多的知识。
这次课程设计下来,我的体会和感觉主要体现在这几方面:
1.感觉这一次课程设计是花了许多心血,翻看课本,查找资料,把许多遗忘了的东西都重拾脑海,每天在宿舍,自己给自己安排好了计划,一步步执行下来,所以课程设计的一个星期,感觉过得很充实,心情也很不错,在这样累积下来,自己亲自完全实现功能出来,感觉很兴奋。
2.在编程实现的过程中,自己也发现了不少的问题,自己感觉很容易的东西却总是出错,而且都是比较低级的错误,感觉很多东西看起来很简单,但在实际编程实现的时候却需要注意各种细节,需要耐心细致,实际编程中遇到一些细节上的小问题确实需要仔细考虑才行。
3.因为银行家算法牵涉的很多要输入的数,所以定义了很多个数组来存放,结果是因为数据太多,时常发生混淆,出了不少的错误,而且不容易找出来,感觉很头疼。
4.为了实现银行家算法,我把课本上的知识进行了全面的复习,在理解的基础上,再在网上搜索资料,进一步掌握了相关知识之后,才开始着手编写程序,通过银行家算法的安全性算法和资源请求算法的实现,对死锁也有更深一层的了解。
使我对操作系统特别是死锁避免这一部分的认识有了很大的加深。
5.课程设计下来,我对操作系统理解更为全面了,并感觉里面有太多的知识需要去掌握,也深深体会的操作系统方面知识的重要性,进而感觉的自己这方面知识的严重不足。
6.最后总体感觉这一次课程设计,时间比较充足,并且也是由自己自由发挥,自己的扩展空间也更大了,有了这样一次课程设计机会,给我带来了很多意想不到的收获。
七参考文献
1.【美国】PeterBaerGalvin等编著郑扣根【译】操作系统概念.第七版北京:
高等教育出版社.2010.
2.张尧学编著.计算机操作系统教程习题解答与实验指导.北京:
清华大学出版社.2000.
3.叶核亚编著陈道蓄主审.java程序设计实用教程.第三版北京:
电子工业出版社
八程序清单
8.1操作主界面代码:
importjava.awt.Color;
publicclassOperatingFrameextendsJFrameimplementsActionListener,CaretListener
{
/**银行家算法
*@paramargs
*/
publicstaticStringdata[]={"0","0"};
publicJButtonbut[]={newJButton("确定"),newJButton("退出")};
publicJTextFieldtextField[]={newJTextField("5",10),newJTextField("3",10)};
publicOperatingFrame()
{
super("银行家算法");
this.setLayout(null);
this.setBounds(530,340,405,295);
this.setDefaultCloseOperation(3);
this.setIconImage(getToolkit().getImage("images/wbto20110516223525.jpg"));
.URLurl=this.getClass().getClassLoader().getResource("images/egs.jpg");
for(inti=0;i{
textField[i].setForeground(Color.blue);
textField[i].setFont(newFont("华文楷体",1,25));
textField[i].setBounds(40+160,100+55*i,50,20);
textField[i].addCaretListener(this);
this.add(textField[i]);
}
JLabellab[]={newJLabel("系统进程数:
"),newJLabel("资源类型数:
"),newJLabel("请输入信息")};
for(inti=0;i{
lab[i].setHorizontalAlignment(JLabel.RIGHT);
lab[i].setForeground(Color.blue);
lab[i].setFont(newFont("华文楷体",1,25));
lab[i].setBounds(40,100+55*i,150,20);
this.add(lab[i]);
}
for(inti=0;i{
but[i].setHorizontalAlignment(JLabel.RIGHT);
but[i].setForeground(Color.blue);
but[i].setFont(newFont("华文楷体",1,10));
but[i].setBounds(170+i*100,220,60,20);
but[i].addActionListener(this);
this.add(but[i]);
}
lab[2].setBounds(100,20,150,30);
JLabellabel=newJLabel();
label.setIcon(newImageIcon(url));
label.setBounds(0,0,400,270);
this.add(label);
this.setVisible(true);
}
publicstaticvoidmain(String[]args)
{
newOperatingFrame();
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==but[0])
{
newOperatingStep1();
this.dispose();
}
if(e.getSource()==but[1])
{
this.dispose();
}
}
publicvoidcaretUpdate(CaretEvente)
{
data[0]=textField[0].getText();
data[1]=textField[1].getText();
}
}
8.2功能实现代码:
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.event.TableModelListener;
importjavax.swing.table.TableModel;
publicclassOperatingStep1extendsJFrameimplementsActionListener
{
/**银行家算法
*@paramargs
*/
publicstaticintm=Integer.parseInt(OperatingFrame.data[0]);//系统进程输
publicstaticintn=Integer.parseInt(OperatingFrame.data[1]);//系统资源类型
publicstaticinttatoal[]=newint[n];//总资源数
publicstaticintavaliable[]=newint[n];//可利用资源数
publicstaticintallocation[][]=newint[m][n];//已用资源数
publicstaticintmax[][]=newint[m][n];//最大资源需求
publicstaticintneed[][]=newint[m][n];//还需的各种资源数
publicstaticintneedi[]=newint[n];//安全性计算用
publicstaticintrequest[][]=newint[m][n];//请求资源数
publicstaticintrequests[]=newint[n];
publicstaticintwork[]=newint[n];//安全性计算用
publicstaticbooleanfilished[]=newboolean[m];//安全性计算用;
publicObjectdata1[][]=newObject[1][n+1];//表格里面数据
publicObjectdata2[][]=newObject[40][n+1];
publicObjectdata3[][]=newObject[40][n+1];
publicObjectdata4[][]=newObject[40][n+1];
publicJButtonbut[]={newJButton("后退"),newJButton("确定"),newJButton("安检"),
newJButton("Request"),newJButton("退出")};//按钮声明
//privateObjecttitle1[]={"Index","Allocation","Max","Work","Filshed"};
//privateObjecttitle2[]={"班次","姓名","性别","单位","身份证","舱类别"};
publicstaticJTabletable1,table2,table3,table4;//表格声明
publicOperatingStep1()
{
super("银行家算法");
this.setLayout(null);
this.setBounds(530,340,605,295);
this.setDefaultCloseOperation(3);
this.setIconImage(getToolkit().getImage("images/egs.jpg"));//设置背景
.URLurl=this.getClass().getClassLoader().getResource("images/dabe.jpg");
//System.out.println(m);
//System.out.println(n);
for(inti=0;i<=0;i++)//表格数据初始化
{
for(intj=1;j<=n;j++)
{
data1[i][j]="10";
}
}
for(inti=0;i{
for(intj=1;j<=n;j++){
data2[i][j]="0";
}
}
for(inti=0;i{
for(intj=1;j<=n;j++){
data3[i][j]="5";
}
}
for(inti=0;i{
for(intj=1;j<=n;j++){
data4[i][j]="0";
}
}
//四个表格
Stringtitle1[]=newString[n+1];//表格一
title1[0]="Index";
for(inti=1;i<=n;i++)
{
title1[i]="s"+i+":
";
}
table1=newJTable(data1,title1);
//table2.getColumnModel().getColumn(4).setPreferredWidth(100);
table1.getTableHeader().setReorderingAllowed(false);//不可整列移动
table1.getTableHeader().setResizingAllowed(false);//不可拉动表格
Objectobj1="tatoal:
";
table1.setValueAt(obj1,0,0);
table1.setRowHeight(15);
table1.setBackground(Color.orange);
table1.setForeground(Color.black);
table1.setEditingColumn
(1);
//table2.setEnabled(true);
table1.setFont(newFont("华文楷体",1,12));
JScrollPanejs1=newJScrollPane(table1);
js1.setBounds(220,10,300,35);
this.add(js1);
Stringtitle2[]=newString