《2022年资源分配和管理的银行家算法银行家算法实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年资源分配和管理的银行家算法银行家算法实验报告 .pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、报告创建时间: 2013.05.16操作系统实验报告年级、专业、班级姓名实验题目资源分配和管理的银行家算法实验时间 2013.05.14实验地点主教 0416实验成绩实验性质验证性设计性综合性教师评价:算法/实验过程正确;源程序/ 实验内容提交程序结构 /实验步骤合理;实验结果正确;语法、语义正确;报告规范;其他:评价教师签名:一、实验目的学习分配和管理资源的银行家算法,了解死锁避免方法。二、实验项目内容编写程序实现教材6.3.2 节的银行家算法程序功能:1. 程序随机生成进程数量( 10) 、资源种类( 3) 、每类资源总数量(3) 、进程的申请资源的数量(0) 、已分配资源的数量、可用资源
2、数量等;2. 输出每一个进程的资源分配情况;3. 输出每一步的资源分配情况和进程执行序列(安全序列)。4. 指出每一次资源分配后系统是否处于安全状态。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16三、实验过程或算法(源程序)31 算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则
3、分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。32 银行家算法步骤(1)如果 Requesti=Need,则转向步骤 (2) ;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果 Requesti=Available,则转向步骤( 3);否则,表示系统中尚无足够的资源,进程必须等待。(3)系统试探把要求的资源分配给进程Pi, 并修改下面数据结构中的数值: Available=Available-Requesti; Allocation=Allocation+Request; Need=Need-Request;(4) 系统执行安全性算法,检查此次资源分配后,系统是
4、否处于安全状态。33 安全性算法步骤(1)设置工作向量工作向量 Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Available;定义判断一个进程是否执行完毕的方法:boolean isFinished()。(2)从进程集合中找到一个能满足下述条件的进程:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16process.isFinished()返回值
5、为true.Need=Work如找到,执行步骤( 3);否则,执行步骤( 4)。(3)当进程 P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Allocation += Need; 转向步骤( 2)。(4)如果所有进程的均执行完毕即isAllFinished()返回值为 true, 则表示系统处于安全状态;否则,系统处于不安全状态。34 数据结构:34. 1 主要用到的数据结构:(1) 保存进程最大资源需求量的矩阵: int _maxNeed(2) 保存进程已分配资源量的矩阵: int _allocated(3) 保存进程标识符的
6、字符串:String _id(4) 保存系统中各资源总数的矩阵:int _totalResource(5) 表示申请资源的进程队列:ArrayList _processes(6) 表示系统资源种类数的整数:int _resourceClassCount(7) 存储执行信息 :StringBuffer _executeInfo34. 2 程序模块:代表进程的类 :Process.java代表银行家算法的类 :BankerAlgorithm.java名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
7、 - 第 3 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16算法的主界面 :BankerUI.java34. 3 各模块间的调用关系:BankerUI 是程序执行的主界面 , 输入系统资源种类数之后 , 其通过程序随机生成进程数量( 10) 、资源种类( 3) 、每类资源总数量( 3) 、进程的申请资源的数量( 0) 、已分配资源的数量、可用资源数量等。其中所用针对系统进程和资源的操作均需要调用类BankerAlgorithm的方法。3.5 主要函数的核心代码:1. 进行初始化输入的函数2. 打印输出的函数3. 利用安全性算法进行检测的函数4. 进行
8、资源分配的函数5. 利用行家算法进行判定的函数注:具体代码请见附录 源程序清单。程序流程图:1、系统主要过程流程图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.162、进程请求资源序列图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 25 页 - - - - - - -
9、 - - 报告创建时间: 2013.05.163、安全性算法序列图四、实验结果及分析和(或)源程序调试过程4.1 主界面:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.164.2 点击“随机生成 ”按钮,随机生成进程数量(10) 、资源种类(3) 、每类资源总数量( 3) 、进程的申请资源的数量(0) 、已分配资源的数量、可用资源数量,并向系统中添加进程,显示进程的资源分配情况。名师资料总结
10、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.164.3 点击“分配资源 ”按钮,检查系统是否安全,如果当前系统安全,则输出安全队列,并给第一个安全进程分配资源。若安全:若不安全,则 “执行结果 ”提示框会提示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 25 页 - - - -
11、- - - - - 报告创建时间: 2013.05.164.4 点击“执行进程 ”按钮,执行已经分配资源的进程,并将其从队列中移除。4.5 点击“分配资源 ”按钮,重新检测当前系统的安全,如果当前系统安全,则输出安全队列,并给第一个安全进程分配资源。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.164.6 此后重复 4、5 步,直至系统中的进程执行完毕:4.7 系统中此时已没有等待执行的进程,
12、若再点击“分配资源 ”按钮,则“执行结果 ”提示框中会提示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.164.8 如果需要再进行模拟,则点击“重新生成 ”按钮,会重新生成进程,再重复前 7 步即可。4.9 如果模拟结束,可点击 “退出”按钮,即可退出系统。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
13、 - - - - - 第 11 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16模拟结束。五、心得体会通过本次实验,我们对银行家算法有了更深的了解,理解了操作系统关于进程调度的一些方法,并通过编程实现了该算法。也进一步提高了我们的编程能力,从中学会了很多。附录:源程序清单1. 主界面类 BankerUI.javapublicclass BankerUI extends JFrame implements ActionListener privatestaticfinallongserialVersionUID = -800454491665304932
14、6L;private JPanel panel ;private JButton model ;private JButton alloc;private JButton next ;private JButton exit;private JTextField processNum ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16/ centerprivate JEditorPane
15、resourcesInfo;private JEditorPane processesInfo; / 用html 格式显示进程需要资源个数.private JTextArea result;private JSplitPane splitCenter;private JPanel east ;privateintresourceClassesCount; / 表示资源的个数private BankerAlgorithm banker ;/private Process pro;privateintPronum = 0;privateintSournum = 0;staticint availa
16、ble = null; / 可利用的资源staticint max = null; / 最大的需求矩阵staticint allocation = null; / 分配矩阵staticint need = null; / 需求矩阵staticint totalSour = null;staticint Max = null;staticint Allocation = null;public BankerUI() super ( 银行家算法 );try UIManager. setLookAndFeel( com.sun.java.swing.plaf.windows.WindowsLookA
17、ndFeel); catch (ClassNotFoundException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (UnsupportedLookAndFeelException e) e.printStackTrace();setBounds(100, 100, 800, 600);panel = new JPanel(new BorderLayout()
18、;/ centerresourcesInfo = new JEditorPane(text/html, );resourcesInfo.setEditable(false);processesInfo = new JEditorPane(text/html, ); / 以html 格式显示进程信息.processesInfo.setEditable(false);JSplitPane splitInfo = newJSplitPane(JSplitPane.VERTICAL_SPLIT );splitInfo.add(new JScrollPane(resourcesInfo), JSplit
19、Pane.TOP );splitInfo.add(new JScrollPane(processesInfo), JSplitPane.BOTTOM );splitInfo.setBorder(BorderFactory.createTitledBorder( 系统信息 );splitInfo.setOneTouchExpandable(true );result = new JTextArea(5, 30);result.setEditable(false);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
20、 - - - - - 第 13 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16result.setWrapStyleWord(true ); / 按单词换行 , 即所有单词都不会打断.result.setLineWrap(true ); / 换行 .JScrollPane textScroll = new JScrollPane(result);textScroll.setBorder(BorderFactory.createTitledBorder( 执行结果 );splitCenter = new JSplitPane(JSplitPane.VE
21、RTICAL_SPLIT );splitCenter.setResizeWeight(1.0);splitCenter.add(splitInfo, JSplitPane.TOP );splitCenter.add(textScroll, JSplitPane.BOTTOM );splitCenter.setOneTouchExpandable(true ); / 点击一下就可以扩展分割开来的控件 .panel .add( splitCenter, BorderLayout.CENTER );panel .setSize(800, 700);/ easteast = new JPanel();
22、/east.setSize(60, 100);model = new JButton( 随机生成 );model .setSize(50, 20);model .setLocation(10, 10);model .addActionListener(this);alloc = new JButton( 分配资源 );alloc.addActionListener(this);next = new JButton( 执行进程 );next .addActionListener(this);exit = new JButton( 退出 );exit.addActionListener(this)
23、;JLabel label = new JLabel(当前进程个数 : );label.setSize(50,20);label.setLocation(10, 60);processNum = new JTextField();processNum .setSize(50, 20);processNum .setLocation(10,90);processNum .setEditable(false);processNum .setFont(new Font(宋体 , Font.BOLD , 20);processNum .setForeground(Color.RED );process
24、Num .setHorizontalAlignment(JTextField.CENTER );east .setLayout(new GridLayout(10,1,10,10);east .setSize(80, 100);east .add(label);east .add( processNum );east .add( model );east .add( alloc);east .add( next );east .add( exit);panel .add( east , BorderLayout.EAST);setEastButtonEnabled(false);/this.g
25、etContentPane().add(new JScrollPane(panel);this.getContentPane().add(panel );setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16publicvoid setEastButtonEnabled(boolean b) / ea
26、stalloc.setEnabled(b);next .setEnabled(b);public BankerAlgorithm getBanker() returnbanker ;/ 一个数组小于另一个数组, 两个数组大小相等.publicboolean aLowerB(int a, int b) for ( int i = 0; i bi)returnfalse;returntrue ;/ 在resourceInfoz中显示系统资源的信息.privatevoid updateTotalResourcesInfo() StringBuffer html = new StringBuffer(
27、100);html.append();html.append(n);StringBuffer resourceNames = new StringBuffer(资源名);StringBuffer resourceCounts = new StringBuffer(资源个数);/int totalResource = banker.getTotalResource();for ( int i = 0; i Sournum; i+) resourceNames.append();resourceNames.append(R + String.valueOf(i);resourceNames.app
28、end();resourceCounts.append();resourceCounts.append(String.valueOf ( totalSouri);resourceCounts.append();resourceNames.append();resourceCounts.append();html.append(resourceNames);html.append(resourceCounts);html.append(nn);resourcesInfo.setText(html.toString();privatevoid updateProcessInfo() StringB
29、uffer content = new StringBuffer(n);content.append(n);content.append(n);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16content.append(资源情况 MaxAllocatedNeedAvilable);content.append();content.append( 进程名 );StringBuffer pr
30、ocessNames = new StringBuffer(40);for ( int i = 0; i Sournum; i+) processNames.append(R + i + );content.append(processNames); / Maxcontent.append(processNames); / Allocatedcontent.append(processNames); / Needcontent.append(processNames); / Avilablecontent.append();ArrayList processes = banker .getPr
31、ocesses();/System.out.println(pppp+processes.size();for ( int i = 0; i processes.size(); i+) Process p = processes.get(i);content.append( + p.makeHtml();if (i = 0) int avilable = banker .getAvilable();for ( int j = 0; j avilable.length; j+)content.append( + avilablej + );if (i = 1)content.append();c
32、ontent.append();content.append(n);content.append(n);content.append();processesInfo.setText(content.toString();processNum .setText( +Pronum);Overridepublicvoid actionPerformed(ActionEvent e) if (e.getSource() = model ) RandomMake();banker = new BankerAlgorithm(totalSour, Sournum , newArrayList();for
33、( int i = 0; i Pronum; i+) Max = new int Sournum ;Allocation = new int Sournum ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16for ( int j = 0; j 0)Pronum-;updateProcessInfo();result.append( 进程 P +pid+ 执行完毕 !n);名师资料总结 -
34、 - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16else JOptionPane.showMessageDialog( this, 系统中所有进程已执行完毕 ! , 提示: , JOptionPane.ERROR_MESSAGE);next .setEnabled(false);next .setEnabled(false);if (e.getSource() = exit) if (JOptionPan
35、e.showConfirmDialog( this, 退出系统 ? , 确定退出,JOptionPane.OK_CANCEL_OPTION ) = JOptionPane.OK_OPTION )System. exit(0);return;publicvoid RandomMake()Random rnd = new Random();Pronum = rnd.nextInt(10)+10;Sournum = rnd.nextInt(5)+3;available = new int Sournum;max = new int Pronum Sournum;allocation = new in
36、t Pronum Sournum ;need = new int Pronum Sournum ;for ( int i = 0; i Sournum; i+) availablei = rnd.nextInt(5) + 3;for ( int i = 0; i Pronum; i+) for ( int j = 0; j Sournum ; j+) allocationij = rnd.nextInt(5);/ 分配矩阵获得随机数for ( int i = 0; i Pronum; i+) for ( int j = 0; j Sournum ; j+) do maxij = rnd.nex
37、tInt(10);/ 最大的需求矩阵获得随机数, 且要比分配矩阵相同位置的数大 while ( maxij allocationij);need = new int Pronum Sournum ;for ( int i = 0; i Pronum; i+) for ( int j = 0; j Sournum ; j+) need ij = maxij - allocationij;totalSour = new int Sournum;for ( int i = 0; i Sournum; i+) totalSouri=availablei;名师资料总结 - - -精品资料欢迎下载 - -
38、 - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16for ( int i = 0; i Pronum; i+) for ( int j = 0; j Sournum ; j+) totalSourj+= allocationij;publicstaticvoid main(String args) throwsClassNotFoundException,InstantiationException, IllegalAccessExcep
39、tion,UnsupportedLookAndFeelException BankerUI banker = new BankerUI();banker.setVisible(true );2. 银行家算法实现类 BankerAlgorithm.javapublicclass BankerAlgorithm / 表示系统中资源种类数/private int saveProcess;privateintsavePNum = 0;privatefinalint_resourceClassesCount;privatefinalint _totalResource;private ArrayList
40、 _processes = new ArrayList();private ArrayList saveProcesses = new ArrayList();private StringBuffer _executeInfo = new StringBuffer(50);public BankerAlgorithm(int totalResource, int resourceClassesCount,ArrayList processes) _resourceClassesCount = resourceClassesCount;_totalResource = totalResource
41、;_processes = processes;private ArrayList newProcesses() ArrayList pList = new ArrayList();for (Process p : _processes) pList.add(p.newProcess();return pList;publicint getAvilable() int avilable = new int _resourceClassesCount;for ( int i = 0; i _resourceClassesCount; +i) avilablei = _totalResourcei
42、 - getResourceAllocated(i);return avilable;/ index代表某个资源的索引, 结果为某个资源的已分配量.privateint getResourceAllocated(int index) int totalAllocated = 0;for (Process p : _processes) int allocated = p.getAllocated();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 25 页 - - -
43、- - - - - - 报告创建时间: 2013.05.16totalAllocated += allocatedindex;return totalAllocated;publicboolean addProcess(Process p) if (isUniqueProcessId(p.getId() _executeInfo.append(p.getId() + = + p.toString();return_processes.add(p); else _executeInfo.append(p.getId() + 与已有进程重名 . );returnfalse;publicvoid r
44、emoveProcess(String processId) removeProcess(getProcessById(_processes, processId);publicvoid removeProcess(Process p) _processes.remove(p);/_executeInfo.append(p.getId();String id ;public String ExecuteProcess()if( savePNum saveProcesses.size()Process p = saveProcesses.get(savePNum);id = p.getId();
45、removeProcess(id );savePNum +;else _executeInfo.append(警告:所有进程已执行完毕!);returnid ;/saveProcesses.remove(p);String idd ;public String AllocationResourse()if( savePNum .int startIndex = _executeInfo.lastIndexOf(- );if (startIndex != -1) _executeInfo.delete(startIndex, startIndex + 2);_executeInfo.append
46、(nn);String info = _executeInfo.toString();_executeInfo.delete(0, _executeInfo.length();return info;public ArrayList getProcesses() return_processes;public String getProcessNames() String names = new String_processes.size();for ( int i = 0; i _processes.size(); i+)namesi = _processes.get(i).getId();
47、return names;/ 判断当前系统是否安全publicboolean isSecured() return isSecured(newProcesses(), getAvilable();privateboolean isSecured(ArrayList pList, int avilable) if (!isAllMaxNeedLowerTotalResource(pList)returnfalse;while (!isAllFinished(pList) Process p = searchProcessLowerAvilable(pList, avilable);if (p !
48、= null) int need = p.getNeed();p.allocate(need);/ System.out.println(p.getId();_executeInfo.append(P + p.getId() + - );saveProcesses.add(p);sub(avilable, need);add(avilable, p.getAllocated(); else _executeInfo.append(系统中剩余进程的资源需求量均大于系统资源可用量 . );returnfalse;returntrue ;private Process getProcessById(
49、ArrayList pList, String id) for (Process p : pList) if (p.equals(id)return p;returnnull;privateboolean isAllFinished(ArrayList pList) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 25 页 - - - - - - - - - 报告创建时间: 2013.05.16for (Process p : pList) if (!p.isFinis
50、hed()returnfalse;returntrue ;publicboolean isAllMaxNeedLowerTotalResource(ArrayList processes) for (Process p : processes) if (!p.isMaxNeedLowerTotalResource(_totalResource, _executeInfo)returnfalse;returntrue ;publicboolean isAllAllocatedLowerMax() for (Process p : _processes)if (!p.isAllocatedLowe