您好,欢迎访问三七文档
淮海工学院计算机工程学院实验报告书课程名:操作系统原理A题目:实验一银行家算法班级:网络131学号:姓名:评语:成绩:指导教师:批阅时间:年月日实验一进程调度实验报告-1-一、目的与要求银行家算法是操作系统中避免死锁的典型算法,用Java或C/C++语言编写一个银行家算法的模拟程序。通过本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。二、实验内容用Java或C/C++语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。实验说明实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。三、实验步骤1.认真理解好课本中银行家算法的实例。2.根据课本中银行家算法的描述,画出程序流程图。初始算法实验一进程调度实验报告-2-银行家算法初始函数资源总数输入进程数输入资源数输入每个进程的最多资源数输入每个进程的已分配资源数输入每个进程的现有资源数初始函数结束否实验一进程调度实验报告-3-算法开始初始化函数提出请求request[]request[]=need[]request[]=available[]Available[]-=request[]allocation[]+=request[]need[]-=request[]safe()输出分配成功是否再次分配退出程序算法结束分配错误Available[]+=request[]allocation[]-=request[]need[]+=request[]errorerrorfalsetruetruetruetruefalsefalsefalsefalse实验一进程调度实验报告-4-3.按照程序流程图,用Java或C/C++语言程并实现。4.实验结果截图1)初界面2)添加资源实验一进程调度实验报告-5-3)输入进程MAX和Allocation实验一进程调度实验报告-6-4)请求资源5)输入p1发出请求request(1.0.2)实验一进程调度实验报告-7-5.实验心得通过本次上机实验,我更加充分的理解了课本上的知识,并能够加以扩展。但是该方案仍然存在许多不足之处。一开始关于如何写出银行家算法一点思路都没有,后来经过上网去查找资料,结合资料,对于银行家算法的不了解之处也解决了。通过自己动手去做发现自己懂的东西真的特别有限,所以我会在后续的课程中,结合这次的经历好好学习。附源码:importjava.awt.Container;importjava.awt.GridLayout;importjava.awt.event.*;importjavax.swing.*;publicclassmainWindowextendsJFrameimplementsActionListener{privatestaticfinallongserialVersionUID=1L;JFramebankerAlgoritJFrame;//主界面JLabel[]l;//输入资源种类数,输入启动的进程数,资源请求,标签JTextField[]t;//对应于标签的文本框JButton[]b;//对应去标签的按钮JPanel[]p;实验一进程调度实验报告-8-intm=0;//添加的进程数intn=0;//添加的资源种类数int[]available;int[][]max;int[][]allocation;int[][]need;int[]request;StringrequestP;String[]processName;String[]processName_Safety;//保存一个安全推进序列String[]resourceName;JPanel[]l1;JTextField[]t1;publicmainWindow(Stringname){super(name);setSize(320,350);setLocation(500,100);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Containercontainer=getContentPane();container.setLayout(null);l=newJLabel[3];t=newJTextField[2];b=newJButton[3];p=newJPanel[3];p[0]=newJPanel();p[1]=newJPanel();p[2]=newJPanel();p[0].setBounds(5,20,300,30);p[1].setBounds(5,120,300,30);实验一进程调度实验报告-9-p[2].setBounds(5,220,300,30);l[0]=newJLabel(输入资源的种类数:);l[1]=newJLabel(输入启动的进程数:);l[2]=newJLabel(资源请求:);t[0]=newJTextField(3);t[1]=newJTextField(3);b[0]=newJButton(添加资源);b[0].addActionListener(this);b[1]=newJButton(启动进程);b[1].addActionListener(this);b[2]=newJButton(请求资源);b[2].addActionListener(this);p[0].add(l[0]);p[0].add(t[0]);p[0].add(b[0]);p[1].add(l[1]);p[1].add(t[1]);p[1].add(b[1]);p[2].add(l[2]);p[2].add(b[2]);container.add(p[0]);container.add(p[1]);container.add(p[2]);实验一进程调度实验报告-10-setVisible(true);}//定义添加资源窗口类classAddResourceWindowextendsJFrameimplementsActionListener{privatestaticfinallongserialVersionUID=1L;JLabelResourceNameL=newJLabel(资源名);JLabelAvailableL=newJLabel(available);JButtonaddResourceOK=newJButton(确定);JLabel[]resourceNameJLabel=newJLabel[n];JTextField[]AvailableTextField=newJTextField[n];JPanel[]addResourceJPanels=newJPanel[n+2];publicAddResourceWindow(){super(添加资源);setSize(320,400);setLocation(500,150);Containercontainer=getContentPane();container.setLayout(null);addResourceJPanels[n+1]=newJPanel();addResourceJPanels[n+1].setBounds(5,20,300,30);addResourceJPanels[n+1].add(ResourceNameL);addResourceJPanels[n+1].add(AvailableL);container.add(addResourceJPanels[n+1]);//动态的添加组件inty=60;chara='A';for(inti=0;in;i++,y=y+40){实验一进程调度实验报告-11-addResourceJPanels[i]=newJPanel();resourceNameJLabel[i]=newJLabel(String.valueOf(a)+:);resourceName[i]=String.valueOf(a);a=(char)(a+1);AvailableTextField[i]=newJTextField(4);AvailableTextField[i].setHorizontalAlignment(JTextField.RIGHT);addResourceJPanels[i].setBounds(5,y,300,30);addResourceJPanels[i].add(resourceNameJLabel[i]);addResourceJPanels[i].add(AvailableTextField[i]);container.add(addResourceJPanels[i]);}addResourceJPanels[n]=newJPanel();addResourceJPanels[n].setBounds(5,y,300,30);addResourceJPanels[n].add(addResourceOK);addResourceOK.addActionListener(this);container.add(addResourceJPanels[n]);setVisible(true);}//将输入的资源名和数量存入available数组,若不填资源名默认为A,B,CvoidgetResource(){for(inti=0;in;i++){try{available[i]=Integer.parseInt(AvailableTextField[i].getText());}catch(Exceptione){JOptionPane.showMessageDialog(null,available为正整数);return;}}this.dispose();实验一进程调度实验报告-12-}@OverridepublicvoidactionPerformed(ActionEvente){Objectob=e.getSource();if(ob==addResourceOK){getResource();}}}//定义启动进程的窗口类,用来输入进程名,max数组和allocation数组classStartProcessextendsJFrameimplementsActionListener{privatestaticfinallongserialVersionUID=1L;JLabelresourceNameJLabel=newJLabel(进程名);JLabelmaxJLabel=newJLabel(max);JLabelallocationJLabel=newJLabel(allocation);JButtonstartProcessOK=newJButton(确定);JPanel[]startProcessJPanel=newJPanel[m+2];JLabel[]processNameJLabel=newJLabel[m];JTextField[][]maxJTextField=newJTextField[m][n];JTextField[][]allocationJTextField=newJTextField[m][n];publicStartProcess(){super(启动进程);setSize(320,400);setLocation(500,150);Con
本文标题:实验2银行家算法
链接地址:https://www.777doc.com/doc-5608627 .html