




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统实验报告年级、专业、班级姓名实验题目资源分配和管理的银行家算法实验时间2013.05.14实验地点主教0416实验成绩实验性质口验证性窗口计性口综合性教师评价:口算法/实验过程正确;口源程序/实验内容提交程口序结构/实验步骤合理;口实验结果正确;口语法、语义正确;口报告规范;其他:评价教师签名:一、实验目的学习分配和管理资源的银行家算法,了解死锁避免方法。二、实验项目内容编写程序实现教材6.3.2节的银行家算法程序功能:1 .程序随机生成进程数量(10)、制种类(3)、燃资源总数量 (3)、进程的申请资源的数量(0)、已分配资源的数量、可用资源数量等;2 .输出每一个进程的资源分配情况
2、;3 .输出每一步的资源分配情况和进程执行 序列(安全序列)。4 .指出每一次资源分配后系统是否处于安全状态。三、实验过程或算法(源程序)3. 1算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于 需要的, 是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用 安全性算法进行检查。若安全,则分配;若不安全,则拒绝 申请,恢复 到原 来的状态,拒绝申请。3. 2银行家算法步骤(1)如果Request。 <=Need,则转向步骤(2);否则,认为出错,因为 它所需要的资 源数已超过它所宣布的最大值。(2)如果Request。 -Available,则转向步骤(3);否则
3、,表示系统 中尚无足够的资源,进程必须等待。(3)系统试探把要 求的资源分配给进程Pi,并修改下面数据结构 中的数Available=Available-Requesti;Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分 配后,系统是否处于安全状态。3. 3安全性算法步骤(1)设置工作向量工作向量Work。它表示系统可提供进程继续运行所需要的各类资 源数目,执行安全算法开始时,Work=Available;定义判断一个进程是否执行完毕的方法:boolean isFinished() 。(2)从进程集合中找到
4、一个能满足下述条 件的进程: process.isFinished()返回值为 true. Need<=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它 的资源,故应执行:Work=Work+Allocation;Allocation += Need;转向步骤(2)。(4)如果所有进程的均执行完毕即isAllFinished()返回值为true,则表示系统处于安全状态;否则,系统处于不安全状态。3. 4数据结构:3. 4. 1主要用到的数据结构:(1)保存进程最大资源需求量的矩阵:int口 _maxNeed 保存进程已
5、分 配资源量的矩阵:int口 .allocated保存进程标识符的字符串:String _id保存系统中各资源总数的矩阵:int口 _totalResource(5)表示申请资源 的进程队歹U :ArrayList<Process> .processes(6)表示系统资源种类数的整数:int _resourceClassCount存储执行信息:StringBuffer _executeInfo3. 4. 2程序模块:代表进程的类:Process.java代表银行家算法的类:BankerAlgohthm.java算法的主界面:BankerUI.java3. 4. 3各模块间的调用关系
6、:BankerUI是程序执行的主界面,输入系统资源种类数之后,其通过程 序随机生成进程数量(10)、资源种类(3)、每类资源总数量(3)、 进程的申请资 源的数量(0)、已分配资源的数量、可用资源数量等。其 中所用针对系统进程和资源的操作均需要调用类BankerAlgorithm的方法。3.5主要函数的核心代码:1 .进行初始化输入的函数2 .打印输出的函数3 .利用安全性算法进行检测的函数4 .进行资源分配的函数5 .利用行家算法进行判定的函数注:具体代码请见附录一源程序清单。程序流程图:1、系统主要过程流程图:报告创建时间:2013.05.162、进程请求资源序列图Bar ice rAlo
7、nthm.rcquesTgelF'OcessQykl/ (P*= nutl jI ! rwuetl 声 上requeshp resource! qjBha.aj i. AJ. iL JULMJUuJUBJLBUL工a.r!i13、安全性算法序列图BarkerAlgo rith m:aScuiretlT-III L-rjS-ecL>nedisSecursdi iev3rccessss 逐一;石匚把四、实验结果及分析和(或)源程序调试过程4.1 主界面:4.2 点击“随机生成”按钮,随机生成进程 数量(10)、资源种类(3)、每类资源总数量(3)、迂程的申请资源的数量(0)、M配资
8、源的数量、可 用资源数量,并向系统中添加进程,显示进程 的资源分配 情况。4.3点击“分配资源”按钮,检查系统是否 安全,如果当前系统安全, 则输出安全队歹I,并给第一个安全进程分配资源。若安全:若不安全,则“执行结果”提示框会提示:一 . 一 J1一 i*j1M冷首串强*不下*回.邛#ISWT. 尾整山士¥止江旷45之中后一工uKWJ司用i书|moIIR2*:同Its陵工,喝4 ;事胃411if 1at)i怛1IS卜1n4.4 点击“执行进程”按钮,执行已经分配 资源的进程,并将其从队列 中移除。4.5 点击“分配资源”按钮,重新检测当前 系统的安全,如果当前系统 安全,则输出安全
9、队列,并给第一个安全进程分配资源。4.6此后重复4、5步,直至系统中的进程执行完毕:4.7 系统中此时已没有等待执行的进程,若再点击“分配资 源”按钮, 则“执行结果”提示框中会提示:4.8如果需要再进行模拟,则点击“重新生成”按钮,会重新生成进程 再重复前7步即可。4.9如果模拟结束,可点击“退出”按钮,即可退出系统模拟结束。五、心得体会通过本次实验,我们对银行家算法有了更深的了解,理解了 操作系统 关于进程调度的一些方法,并通过编程实现了该算法。也进 一步提高 了我们的编程能力,从中学会了很多。附录:源程序清单1 .主界面类 BankerUI.javapublic class Banker
10、UI extends JFrame implements ActionListener private static final longserialVersionUID =-8004544916653049326L; private JPanel panel ;privateJButtonmodel;privateJButtonalloc;privateJButtonnext;privateJButtonexit;private JTextField processNum ;/ centerprivateJEditorPaneresourcesInfo;privateJEditorPanep
11、rocessesInfo;/ 用html格式显示进程需要资源个数private JTextArea result ;privateJSplitPanesplitCenter;privateJPanel east ;private int resourceClassesCount ; / / 表示资源的个数private BankerAlgorithm banker ;/private Process pro;private intPronum = 0;private intSournum = 0;static intavailable = null ; / 可利用的资源static int m
12、ax = null ; / 最大的需求矩阵static int allocation= null ; /分配矩阵static int need = null ; / 需求矩阵static inttotalSour = null ;static intMax = null ;static intAllocation= null ;public BankerUI() super ("银行家算法");try UIManager.setLookAndFeel ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
13、;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();/ cent
14、erresourcesInfo= new JEditorPane(resourcesInfo .setEditable(false"text/html" );,"<html></html>" );processesInfo= new JEditorPane("text/html","<html></html>" );/以hm格式显示进程信息.processesInfo .setEditable(falseJSplitPane splitInfo =new);JSpli
15、tPane(JSplitPane.VERTICAL_SPLIT);splitInfo.add(new JScrollPane(resourcesInfo),JSplitPane.TOD;splitInfo.add(new JScrollPane(processesInfo),JSplitPane. BOTTOMsplitInfo.setBorder(BorderFactory.createTitledBorder ("系统信息");splitInfo.setOneTouchExpandable(true );result result=new JTextArea(5, 30
16、);.setEditable(false );result .setWrapStyleWord( true ); / 按单词换行,即所有单词都不会打断.result .setLineWrap( true ); / 换彳f.JScrollPane textScroll =new JScrollPane( result );textScroll.setBorder(BorderFactory.createTitledBorder("执行结果")splitCenter= new JSplitPane(JSplitPane.VERTICAL_SPLIT );splitCenter.
17、setResizeWeight(1.0);splitCenter .add(splitInfo, JSplitPane.TOP);splitCenter.add(textScroll, JSplitPane.BOTTOMsplitCenter .setOneTouchExpandable( true ); / 点击一下就可以扩展分割开来的控件.panel .add( splitCenter , BorderLayout.CENTER;panel .setSize(800, 700);/ easteast = new JPanel();/east.setSize(60, 100);model =
18、 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 .addActio
19、nListener(this );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 .se
20、tForeground(Color.RED);processNum .setHorizontalAlignment(JTextField.CENTEReast .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);setEas
21、tButtonEnabled(false );/this.getContentPane().add(new JScrollPane(panel);this .getContentPane().add(panel );setDefaultCloseOperation(JFrame.EXIT ON CLOSE);public void setEastButtonEnabled( boolean b) / eastalloc .setEnabled(b);next .setEnabled(b);public BankerAlgorithm getBanker() return banker ;/一个
22、数组小于另一个数组,两个数组大小相等.public boolean aLowerB( int 口 a,int b) for ( inti = 0; i < a. length ; i+) if (ai > bi)return false ;return true ;/ 在resourceInfoz中显示系统资源的信息private void updateTotalResourcesInfo() StringBuffer html = new StringBuffer(100);html.append("<html><body>" );ht
23、ml.append("<table width = "100%" border = "1"bgcolor="#C0C0C0" bordercolor="#000000">n" StringBuffer resourceNames =</td>");StringBuffer resourceCounts =);new StringBuffer(new StringBuffer(</td>");/int totalResource = bank
24、er.getTotalResource();for ( int i = 0; i < Sournum; i+) resourceNames.append( "<td>");resourceNames.append( "R" + String.resourceNames.append( "</td>");valueOf"<tr><td> 资源名"<tr><td>资源个数(i);resourceCounts.append("<
25、td>");resourceCounts.append(String. valueOf (totalSour i);resourceCounts.append("</td>");resourceNames.append( "</tr>");resourceCounts.append( "</tr>");html.append(resourceNames);html.append(resourceCounts);html.append( "</table>n<
26、;/body>n</html>");resourcesInfo .setText(html.toString(); private void updateProcessInfo() StringBuffer content =new StringBuffer( "<html>n" );content.append("<body>n");content.append("<table width = "100%" border = "1"bgcolor
27、="#C0C0C0" bordercolor="#000000">n");content.append( "<tr><td> 资源情况 </td><td align = "center"colspan ="+ Sournum+ ">Max</td><td align = "center" colspan ="+ Sournum+ ">Allocated</td><
28、;td align = "center" colspan ="+ Sournum+ ">Need</td><td align = "center" colspan ="+ Sournum + ">Avilable</td></tr>");content.append( "<tr>");content.append( "<td> 进程名 </td>");StringBuffer
29、processNames = new StringBuffer(40);for(int i = 0; i <Sournum; i+) processNames.append( "<td>R"+ i +"</td>" );content.append(processNames);/ Maxcontent.append(processNames);/ Allocatedcontent.append(processNames);/ Needcontent.append(processNames);/ Avilablecontent
30、.append( "</tr>");ArrayList<Process> processes =banker .getProcesses();System.out.println("pppp"+processes.size();for(int i = 0; i < processes.size(); i+) Process p = processes.get(i);content.append( "<tr>"+ p.makeHtml();if (i = 0) int avilable =ban
31、ker .getAvilable();for (int j = 0; j < avilable.length ; j+)content.append( "<td>"+ avilablej +"</td>"if (i = 1)content.append( "<td rowspan ="+ String. valueOf (processes.size() - 1)+ " colspan = "3"></td>");content.append
32、( "</tr>");content.append("</table>n");content.append("</body>n");content.append("</html>");processesInfo .setText(content.toString(); processNum .setText( "" +Pronum); Overridepublic void actionPerformed(ActionEvent e) if (e.
33、getSource() = model) RandomMake();banker = new BankerAlgorithm( totalSour , Sournum, new ArrayList<Process>();for ( int i = 0; i < Pronum ; i+) Max = new int Sournum;Allocation = new int Sournum;for (int j = 0; j < Sournum ; j+) Maxj = maxij;Allocationj =allocation ij;Process pro =newPro
34、cess(String. valueOf (i), Max, Allocation , Sournum);if ( banker .addProcess(pro) result .setText( result .getText() +"成功添加进程:"+ banker .getExecuteInfo(); else result .setText( result .getText() +"添加进程失败:”+ banker .getExecuteInfo();return ;updateProcessInfo();updateTotalResourcesInfo(
35、);/ 更新系统资源信息.updateProcessInfo(); / 更新系统进程资源信息.alloc .setEnabled( true );next .setEnabled( false );model .setText("重新生成");if (e.getSource() =alloc ) String names =banker .getProcessNames();if (names. length = 0) result .setText( result .getText() +"当前系统中没有进程,无法分配资源! n");next .set
36、Enabled( false ); return ;if (banker .isSecured() String id = banker .AllocationResourse();result .setText( result .getText() +"进程 P"+id+ "资源分配成功! n" +"当前系统是安全的.n安全序列:"+ banker .getExecuteInfo();updateProcessInfo(); / 更新系统进程资源信息.next .setEnabled( true ); else result .se
37、tText( result .getText() +”资源分配失败!n" + "当前系统是不安全的.n详细信息如下:"+ banker .getExecuteInfo();next .setEnabled( false ); return ;if (e.getSource() = next ) String pid = banker .ExecuteProcess();if ( Pronum > 0)Pronum-;updateProcessInfo();result .append("进程 P"+pid+ "执行完毕!n&qu
38、ot;); else JOptionPane. showMessageDialog (this ,"系统中所有进程已执 行完毕!","提示:",JOptionPane. ERROR_MESSAG;Enext .setEnabled( false );next .setEnabled( false ); if (e.getSource() = exit ) if (JOptionPane. showConfirmDialog (this ,"退出系统?","确定退 出",JOptionPane. OK_CANCEL_
39、OPTION=JOptionPane. OK_OPTION)System. exit (0);return ;public void 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 int Pronum Sournum ;need = new int Pronum Sournum;for ( int i =
40、 0; i < Sournum; i+) available i = rnd.nextInt(5) + 3;for ( int i = 0; i < Pronum; i+) for ( int j = 0; j < Sournum ; j+) allocation ij = rnd.nextInt(5);/ 分配矩阵获得随机数for ( int i = 0; i < Pronum; i+) for ( int j = 0; j < Sournum ; j+) do maxij = rnd.nextInt(10);/ 最大的需求矩阵获得随机数,且要比分配矩阵相同位置
41、的数大 while (maxij < allocation ij); need = new int Pronum Sournum;for ( int i = 0; i < Pronum; i+) for ( int j = 0; j < Sournum ; j+) need ij = maxij - allocation ij; totalSour = new int Sournum;for ( int i = 0; i < Sournum; i+) totalSour i= available i;for ( int i = 0; i < Pronum; i+)
42、 for ( int j = 0; j < Sournum ; j+) totalSour j+= allocation ij;public static voidmain(String args) throwsClassNotFoundException,InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException BankerUI banker =new BankerUI();banker.setVisible(true );2 .银行家算法实现类BankerAlgorithm.java
43、public class BankerAlgorithm /表示系统中资源种类数/private int saveProcess;private int savePNum = 0;private final int_resourceClassesCount ;private final int _totalResource ;privateArrayList<Process>_processes = new ArrayList<Process>();privateArrayList<Process>saveProcesses = new ArrayList&
44、lt;Process>();private StringBuffer _executeInfo = new StringBuffer(50);public BankerAlgorithm( int totalResource, int resourceClassesCount, ArrayList<Process> processes) _resourceClassesCount = resourceClassesCount;_totalResource = totalResource;_processes = processes; 一private ArrayList<
45、;Process> newProcesses() ArrayList<Process> pList =new ArrayList<Process>();for (Process p :_processes ) pList.add(p.newProcess();return pList;public int getAvilable() int avilable = new int .resourceClassesCount ;for (int i = 0; i < .resourceClassesCount ; +i) avilablei = .totalRe
46、source i - getResourceAllocated(i);return avilable;/ index代表某个资源的索引,结果为某个资源的已分配量.private int getResourceAllocated( int index) int totalAllocated = 0;for (Process p :.processes ) int allocated = p.getAllocated();报告创建时间:_2013.05.16totalAllocated += allocatedindex; return totalAllocated;public boolean
47、addProcess(Process p) if (isUniqueProcessId(p.getId() _executeInfo .append(p.getId() +"=" + p.toString();return .processes .add(p); else _executeInfo .append(p.getId() +"与已有进程重名.");return false ;public void removeProcess(String processId) removeProcess(getProcessById( .processes
48、, processId);public void removeProcess(Process p) .processes .remove(p);executelnfo.append(p.getld(); 一String id ;public String ExecuteProcess()if (savePNum < saveProcesses .size() Process p = saveProcesses .get( savePNum); id = p.getId();removeProcess( id );savePNum +; else _executeInfo .append(
49、"警告:所有进程已执行完毕!"); return id ;/saveProcesses.remove(p);String idd ;public String AllocationResourse()if (savePNum < saveProcesses .size()Process p = saveProcesses .get( savePNum); idd = p.getId();int 口 pmax = p.getMaxNeed();p.setAllocated(pmax);saveProcesses .set( savePNum, p);int no = 0
50、;for (Process pp :.processes ) if (idd = pp.getId() .processes .set(no, p); 一 no+; return idd ;public String getExecuteInfo() /若存在安全序列,则要删除最后一个"->”.int startindex = _executeInfo .lastIndexOf( "->");if (startindex != -1) _executeInfo .delete(startIndex, startindex + 2); 一_execute
51、Info .append( "nn");String info = _executeInfo .toString();_executeInfo .delete(0, _executeInfo .length(); return info;public ArrayList<Process> getProcesses() return .processes ;一publicString口 getProcessNames() String口 names = new String .processes .size();for (int i = 0; i < .pr
52、ocesses .size(); i+) namesi = .processes .get(i).getId(); return names;/判断当前系统是否安全 public boolean isSecured() return isSecured(newProcesses(), getAvilable();private boolean isSecured(ArrayList<Process> pList,int avilable) if (!isAllMaxNeedLowerTotalResource(pList) return false ;while (!isAllFi
53、nished(pList) Process p = searchProcessLowerAvilable(pList, avilable); if (p != 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()
54、; else _executeinfo.append("系统中剩余进程的资源需求量均大于系统资源可用量.”);return false; return true ;private Process getProcessById(ArrayList<Process> pList, String id) for (Process p : pList) if (p.equals(id) return p; return null ;private boolean isAllFinished(ArrayList<Process> pList) for (Process
55、p : pList) if (!p.isFinished() return false ;return true;public booleanisAllMaxNeedLowerTotalResource(ArrayList<Process>processes)for (Process p: processes)if (!p.isMaxNeedLowerTotalResource( _totalResource , _executeInfo )return false ;return true;public booleanisAllAllocatedLowerMax() for (P
56、rocess p :_processes )if (!p.isAllocatedLowerMax() _executeInfo.append("进程"+ p.getId() +"的已分配资源数大于其所需要的最大资源量.n");return false ; return true;public booleanisAllAllocatedLowerTotalResource() for (int i = 0; i < _resourceClassesCount ; i+) if (_totalResource i < getResourceAllocated(i) _executeInfo .append("资源R" + i +"的已分配总量大于 系统中该资源的最大数目.n"); 一return false ; return true ;private Process searchProcessLowerAvilable(ArrayList<Process> pList, int 口 avilable) f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息守秘维护承诺书(6篇)
- 2025年黄山市祁门文化旅游发展集团有限公司招聘5人考前自测高频考点模拟试题及答案详解(全优)
- 个性化权益保护保证承诺书6篇
- 2025年山东省黄河三角洲农业高新技术产业示范区山东省师范类高校学生从业技能大赛一、二等奖获得者(13人)模拟试卷及答案详解(有一套)
- 2025年福建省福州市水路运输事业发展中心招聘1人模拟试卷及答案详解(网校专用)
- 2025年湖北省三支一扶招聘考试(2000人)模拟试卷附答案详解
- 地方戏剧保护与振兴承诺书5篇
- 客户服务流程优化与工具集成方案
- 江苏省扬州市三校2024-2025学年高二上学期10月联合测试地理试卷(解析版)
- 2025年广东华润电力春季招聘考前自测高频考点模拟试题及答案详解(有一套)
- 2025广东广州市白云区民政局招聘窗口服务岗政府雇员1人笔试备考试题及答案解析
- 国家开放大学《药物治疗学(本)》形考作业1-4参考答案
- 《加工工艺学》2-2特种铸造
- GB/T 6342-1996泡沫塑料与橡胶线性尺寸的测定
- 第五章电压暂降及短时间中断
- GB/T 1423-1996贵金属及其合金密度的测试方法
- GB 17790-2008家用和类似用途空调器安装规范
- 2022年曲靖市交通建设投资集团有限公司招聘笔试题库及答案解析
- 高中综合实践活动
- HBN品牌拆解报告
- 【课件】Unit 4 Body Language Reading and Thinking 课件-2021-2022学年高中英语人教版(2019)选择性必修第一册
评论
0/150
提交评论