模拟银行家算法实现死锁避免课程设计报告

上传人:be****l 文档编号:107211228 上传时间:2022-06-14 格式:DOC 页数:36 大小:572KB
返回 下载 相关 举报
模拟银行家算法实现死锁避免课程设计报告_第1页
第1页 / 共36页
模拟银行家算法实现死锁避免课程设计报告_第2页
第2页 / 共36页
模拟银行家算法实现死锁避免课程设计报告_第3页
第3页 / 共36页
点击查看更多>>
资源描述
.操作系统课程设计报告院 系:计算机与信息工程学院 题 目:模拟银行家算法实现死锁避免评分表:课题名称指导教师评 语成绩评定姓 名成 绩学 号日期年 月 日目录题目:模拟银行家算法实现死锁避免1评分表:2一课程设计目的3二课程设计容3三课程设计环境4四课程设计步骤441.需求分析44.1.1 问题的提出44.1.2 银行家算法原理44.1.3银行家算法详细解析54.1.4 银行安全性算法目的64.2概要设计64.2.1 功能模块设计如下:64.2.2 功能模块描述74.3详细设计74.3.1基本数据结构的设计74.3.2算法的设计8五课程设计结果95.1运行结果95.2测试分析12六课程设计心得与体会12总结12七参考文献13八程序清单148.1 操作主界面代码:148.2 功能实现代码:17一 课程设计目的在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。二 课程设计容模拟实现银行家算法对系统资源进行分配,以防止死锁的出现。本课题肯定不可能实现对实际操作系统的资源管理,而是通过对模拟资源数据的处理,检测银行家算法在防止死锁出现的作用。银行家算法描述:第一部分:银行家算法(扫描)1如果Request=Need,则转向2;否则,出错2如果Request=Available,则转向3,否则等待3系统试探分配请求的资源给进程4系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finishi=False&Need=Work,则执行3;否则执行4(i为资源类别)3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:Work=Work+Allocation;Finishi=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; GOTO 2 (4)如所有的进程Finish= true,则表示安全;否则系统不安全。2、资源请求算法:设进程k提出请求requesti,则银行家算法按如下规则进行判断。 (1)如果request k i= needki,则转(2);否则,出错。 (2)如果request ki= avaliableki,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: avaliable i-= request ki; avaliable ki+= request ki; needki-= request ki; (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。4.1.4 银行安全性算法目的银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。4.2概要设计操作主界面输入系统进程数4.2.1 功能模块设计如下:输入资源类型数进入操作界面输入allocation输入系统总资源数输入max(最大资源数)资源请求检测安全性检测图4.2.1:程序功能模块设计图4.2.2 功能模块描述第一部分:银行家算法1如果Request=Need,则转向2;否则,出错2如果Request=Available,则转向3,否则等待3系统试探分配请求的资源给进程4系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finishi=False&Need=Work,则执行3;否则执行4(i为资源类别)3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:Work=Work+Allocation;Finishi=true;转24.3详细设计4.3.1基本数据结构的设计static int tatoaln;/总资源数static int avaliable;/可利用资源数static int allocation;/已用资源数static int max;/最大资源需求static int need;/还需的各种资源数static int request;/请求资源数4.3.2算法的设计银行家安全性算法思路:对各进程、资源初始化开始进程Pi申请资源是否满足申请条件NO系统安全性检测正式分配资源YES安全不安全图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. 美国Peter Baer Galvin等编著 扣根 译 操作系统概念.第七版 :高等教育.2010.2. 尧学编著.计算机操作系统教程习题解答与实验指导.: 清华大学.2000.3.叶核亚编著 道蓄主审. java程序设计实用教程. 第三版 :电子工业八 程序清单8.1 操作主界面代码:import java.awt.Color;public class OperatingFrame extends JFrame implements ActionListener,CaretListener/*银行家算法 * param args */public static String data=0,0;public utton but=new utton(确定),new utton(退出);public JTextField textField=new JTextField (5,10),new JTextField (3,10);public OperatingFrame()super(银行家算法);this.setLayout(null);this.setBounds(530, 340, 405, 295);this.setDefaultCloseOperation(3);this.setIconImage(getToolkit().getImage(images/wbto525.jpg);.URLurl=this.getClass().getClassLoader().getResource(images/egs.jpg);for(int i=0;itextField.length;i+)textFieldi.setForeground(Color.blue);textFieldi.setFont(new Font(华文楷体,1,25);textFieldi.setBounds(40+160,100+55*i, 50, 20);textFieldi.addCaretListener(this);this.add(textFieldi);JLabel lab=new JLabel(系统进程数:),new JLabel(资源类型数:),new JLabel(请输入信息);for(int i=0;ilab.length;i+)labi.setHorizontalAlignment(JLabel.RIGHT);labi.setForeground(Color.blue);labi.setFont(new Font(华文楷体,1,25);labi.setBounds(40,100+55*i, 150, 20);this.add(labi);for(int i=0;ibut.length;i+)buti.setHorizontalAlignment(JLabel.RIGHT);buti.setForeground(Color.blue);buti.setFont(new Font(华文楷体,1,10);buti.setBounds(170+i*100,220, 60, 20);buti.addActionListener(this);this.add(buti);lab2.setBounds(100,20, 150, 30);JLabel label=new JLabel();label.setIcon(new ImageIcon(url);label.setBounds(0,0,400,270);this.add(label);this.setVisible(true);public static void main(String args)new OperatingFrame();public void actionPerformed(ActionEvent e)if (e.getSource()=but0)new OperatingStep1();this.dispose();if (e.getSource()=but1)this.dispose();public void caretUpdate(CaretEvent e) data0=textField0.getText();data1=textField1.getText();8.2 功能实现代码:import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.utton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.event.TableModelListener;import javax.swing.table.TableModel;public class OperatingStep1 extends JFrame implements ActionListener/*银行家 算法 * param args */public static int m=Integer.parseInt(OperatingFrame.data0);/系统进程 输public static int n=Integer.parseInt(OperatingFrame.data1);/系统资源类型public static int tatoal=new int n;/总资源数public static int avaliable=new int n;/可利用资源数public static int allocation=new int mn;/已用资源数public static int max=new int mn;/最大资源需求public static int need=new int mn;/还需的各种资源数public static int needi=new int n;/安全性计算用public static int request=new int mn;/请求资源数public static int requests=new int n;public static int work=new intn;/安全性计算用public static boolean filished=new booleanm;/安全性计算用;public Object data1=new Object1n+1;/表格里面数据public Object data2=new Object40n+1;public Object data3=new Object40n+1;public Object data4=new Object40n+1;public utton but=new utton(后退),new utton(确定),new utton(安检),new utton(Request),new utton(退出);/按钮声明/private Object title1=Index,Allocation,Max,Work,Filshed;/private Object title2=班次,性别,单位,舱类别;public static JTable table1,table2,table3,table4;/表格声明public OperatingStep1()super(银行家算法);this.setLayout(null);this.setBounds(530, 340, 605, 295);this.setDefaultCloseOperation(3);this.setIconImage(getToolkit().getImage(images/egs.jpg);/设置背景.URL url=this.getClass().getClassLoader().getResource(images/dabe.jpg);/System.out.println(m);/System.out.println(n);for(int i=0;i=0;i+)/表格 数据初始化for(int j=1;j=n;j+)data1ij=10;for(int i=0;im;i+)for(int j=1;j=n;j+)data2ij=0;for(int i=0;im;i+)for(int j=1;j=n;j+)data3ij=5;for(int i=0;im;i+)for(int j=1;j=n;j+)data4ij=0;/四个表格String title1=new String n+1;/表格一title10=Index;for(int i=1;i=n;i+)title1i=s+i+:;table1=new JTable(data1,title1);/table2.getColumnModel().getColumn(4).setPreferredWidth(100 );table1.getTableHeader().setReorderingAllowed(false); /不可整列移动 table1.getTableHeader().setResizingAllowed(false); /不可拉动表格Object obj1=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(new Font(华文楷体,1,12);JScrollPane js1=new JScrollPane(table1);js1.setBounds(220, 10, 300, 35);this.add(js1);String title2=new String n+1;/表格二title20=Index;for(int i=1;i=n;i+)title2i=s+i+:;table2=new JTable(data2,title2);/table2.getColumnModel().getColumn(4).setPreferredWidth(100 );table2.getTableHeader().setReorderingAllowed(false); /不可整列移动 table2.getTableHeader().setResizingAllowed(false); /不可拉动表格Object obj2=new Object m;for(int i=0;im;i+)obj2i=p+i+:;table2.setValueAt(obj2i,i,0);table2.setRowHeight(15);table2.setBackground(Color.orange);table2.setForeground(Color.black);table2.setEditingColumn(1);/table2.setEnabled(true);table2.setFont(new Font(华文楷体,1,12);JScrollPane js2=new JScrollPane(table2);js2.setBounds(35, 100, 150, 100);this.add(js2);String title3=new String n+1;/表格三title30=Index;for(int i=1;i=n;i+)title3i=s+i+:;/for(int i=0;ititle3.length;i+)/System.out.print(title3i+ );table3=new JTable(data3,title3);/table1.getColumnModel().getColumn(4).setPreferredWidth(100 );table3.getTableHeader().setReorderingAllowed(false); /不可整列移动 table3.getTableHeader().setResizingAllowed(false); /不可拉动表格Object obj3=new Object m;for(int i=0;im;i+)obj3i=p+i+:;table3.setValueAt(obj3i,i,0);table3.setRowHeight(15);table3.setBackground(Color.orange);table3.setForeground(Color.black);table3.setEditingColumn(1);/table1.setEnabled(true);table3.setFont(new Font(华文楷体,1,12);JScrollPane js3=new JScrollPane(table3);js3.setBounds(220, 100, 150, 100);this.add(js3);String title4=new String n+1;/表格四title40=Index;for(int i=1;i=n;i+)title4i=s+i+:;/for(int i=0;ititle4.length;i+)/System.out.print(title4i+ );table4=new JTable(data4,title4);/table1.getColumnModel().getColumn(4).setPreferredWidth(100 );table4.getTableHeader().setReorderingAllowed(false); /不可整列移动 table4.getTableHeader().setResizingAllowed(false); /不可拉动表格Object obj4=new Object m;for(int i=0;im;i+)obj4i=p+i+:;table4.setValueAt(obj4i,i,0);table4.setRowHeight(15);table4.setBackground(Color.orange);table4.setForeground(Color.black);table4.setEditingColumn(1);/table1.setEnabled(true);table4.setFont(new Font(华文楷体,1,12);JScrollPane js4=new JScrollPane(table4);js4.setBounds(400, 100, 150, 100);this.add(js4);JLabel lab=new JLabel(Allocation:),new JLabel(Max:),new JLabel(Request:),new JLabel(tatoal:);for(int i=0;ilab.length;i+)/四个标签labi.setHorizontalAlignment(JLabel.RIGHT);labi.setForeground(Color.blue);labi.setFont(new Font(华文楷体,1,25);labi.setBounds(30+i*150,70,150, 20);this.add(labi);lab3.setBounds(50, 20, 150, 30);for(int i=0;ibut.length;i+)/四个按钮buti.setForeground(Color.blue);buti.setFont(new Font(华文楷体,1,10);buti.setBounds(80+i*100,230, 75, 20);buti.addActionListener(this);this.add(buti);/* * 获取初始化后表格里面的各个数据,并转化为int型*/for(int i=1;i=n;i+)tatoali-1=Integer.parseInt(String)table1.getValueAt(0, i);for(int i=0;im;i+)for(int j=1;j=n;j+)allocationij-1=Integer.parseInt(String)table2.getValueAt(i, j);for(int i=0;im;i+)for(int j=1;j=n;j+)maxij-1=Integer.parseInt(String)table3.getValueAt(i, j);for(int i=0;im;i+)for(int j=1;j=n;j+)requestij-1=Integer.parseInt(String)table4.getValueAt(i, j);JLabel label=new JLabel();/图片背景标签label.setIcon(new ImageIcon(url);label.setBounds(0,0,600,270);this.add(label);/table1.isCellEditable(0, 0);this.setVisible(true);public static void main(String args)new OperatingStep1();public boolean isCellEditable(int rowIndex, int columnIndex) /重写iscelleditable方法if(columnIndex!=1)return false;elsereturn true;public void actionPerformed(ActionEvent e) if (e.getSource()=but0)/后退按钮new OperatingFrame();if (e.getSource()=but1)/数据保存按钮/* * 获取表格里面的各个数据,并转化为int */for(int i=1;i=n;i+)tatoali-1=Integer.parseInt(String)table1.getValueAt(0, i);for(int i=0;im;i+)for(int j=1;j=n;j+)allocationij-1=Integer.parseInt(String)table2.getValueAt(i, j);for(int i=0;im;i+)for(int j=1;j=n;j+)maxij-1=Integer.parseInt(String)table3.getValueAt(i, j);for(int i=0;im;i+)for(int j=1;j=n;j+)requestij-1=Integer.parseInt(String)table4.getValueAt(i, j);int allocations=new intn;for(int i=0;in;i+)allocationsi=0;for(int i=0;in;i+)for(int j=0;jm;j+)allocationsi+=allocationji;/获取每种资源被使用的总和for(int i=0;in;i+)avaliablei=tatoali-allocationsi;/avaliable赋初值/worki=avaliablei+allocation0i;/work赋初值for(int i=0;in;i+)requestsi=0;for(int i=0;in;i+)for(int j=0;jm;j+)requestsi+=requestji;/获取每种资源被请求的总和for(int i=0;im;i+)for(int j=0;jn;j+)needij=maxij-allocationij;/求得所需资源数for(int i=0;i1;i+)for(int j=0;jn;j+)workj=avaliablej;JOptionPane.showMessageDialog(this, 保存成功!请继续操作!);if (e.getSource()=but2)/安全检测按钮int count=m;for(int i=0;im;i+)filishedi=false;for(int i=0;ifilished.length;i+)for(int j=0;jn;j+)needij=needij;/System.out.print( needi: +needij);/System.out.print( work: +workj);if(filishedi=false&equals(needi,work)/for(int j=0;jneedi.length;j+)/System.out.print(needi: +needij+ worki+workj);System.out.print( p+i);addWork(work,i);filishedi=true;if(i=filished.length-1)if(count=1)break;i=-1;count-;for(int i=0;ifilished.length;i+)if(filishedi!=true)JOptionPane.showMessageDialog(this, 系统处于不安全状态,将产生死锁);break;elseif(i=filished.length-1)JOptionPane.showMessageDialog(this, 系统处于安全状态);if (e.getSource()=but3)/请求按钮if(equalsRequest()/System.out.print(requestij);/System.out.print(needij);/System.out.print(avaliablej);f(JOptionPane.showConfirmDialog(this, 资源请求安全!请选择是否继续操作!)=0)but1.doClick();addRequest();for(int t=0;tn;t+)avaliablet-=requestst;but2.doClick();/*int count=m;for(int s=0;sm;s+)filisheds=false;for(int s=0;sfilished.length;s+)for(int q=0;qn;q+)neediq=needsq;System.out.print( needi: +neediq);System.out.print( work: +workq);if(filisheds=false&equals(needi,work)for(int q=0;qneedi.length;q+)System.out.print(needi: +neediq+ worki+workq);System.out.println(equal:+equals(needi,work);System.out.println(p+s);addWork(work,s);filisheds=true;if(s=filished.length-1)if(count=1)break;s=-1;count-;for(int s=0;sfilished.length;s+)if(filisheds!=true)JOptionPane.showMessageDialog(this, 系统处于不安全状态,将产生死锁);break;elseif(s=filished.length-1)JOptionPane.showMessageDialog(this, 系统处于安全状态);*/else return;elseJOptionPane.showMessageDialog(this, 资源请求不安全!);if (e.getSource()=but4)/退出this.dispose();public static boolean equals(int needi,int work)/needi和work的比较for(int i=0;ineedi.length;i+)if(needii=worki)else return false;return true;public static void addWork(int work,int k)/work+allocationfor(int i=0;iwork.length;i+)worki+=allocationki;public static void addRequest()/request+allocationfor(int i=0;im;i+)for(int j=0;jn;j+)allocationij+=requestij;needij-=requestij;public static boolean equalsRequest()/request与need和avaliable的比较for(int i=0;im;i+)for(int j=0;jneedij|requestijavaliablej)return false;else continue;return true;36 / 36
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!