资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计科112康岩岩201100814220操作系统实验报告实验四:银行家算法的实现计科112 康岩岩 2011008142202013/4/29实验四:银行家算法的实现一实验目的(1) 加深了解有关资源申请、避免死锁等概念。(2) 体会和了解死锁和避免死锁的具体实施方法。二实验属性该实验为设计性实验。三实验仪器设备及器材普通PC386以上微机四实验要求本实验要求2学时完成。本实验要求完成如下任务:(1)设计进程对各类资源最大申请表示及初值的确定。(2)设定系统提供资源的初始状况。(3)设定每次某个进程对各类资源的申请表示。(4)编制程序,依据银行家算法,决定其资源申请是否得到满足。(5)显示资源申请和分配时的变化情况。五实验步骤(一)任务分析:实现银行家算法,首先需要构造四张链表表,如下:进程最大需求数量表:Maxmn进程以获取资源量表 Allocationmn需求表 Needmn可用资资源 Availablen其中,m表示进程数目。n表示资源数目。 对于银行家算的实现,我们可以先初始化一部分数据,模拟出某一状态下的资源分配情况。并发出资源请求,然后判断请求是否可行,并寻找安全序列。 可以看出,本次试验会设计到大量的数据,所以为了简化步骤,并且能直观的得到算法运行结果,需要用到窗口来呈现数据变化情况。(二)程序设计:(1) 总体设计:本次试验语言为java。程序分两大部分,一部分是核心的银行家算法,用来处理资源请求。另一部分是界面,用来发出资源请求并显示处理结果。利用java的swing编程和相关IDE,很容易初始化资源分布情况,下面是其截图:(2) 具体实现:核心部分,银行家算法: 算法的实现完全按照教材中的步骤来进行,具体实现如下:/* * * param processID 进程号 * param ra 请求A类资源数量 * param rb 请求A类资源数量 * param rc 请求C类资源数量 */public static List checkEnable(int processID, int ra, int rb, int rc) /得等到该进程对各类资源的需求量数组Integer need = Need.get(processID);/得等到该进程的各类资源的就绪量数组Integer allocation = Allocation.get(processID);/检测请求数量是否大于需求量if (ra need0 | rb need1 | rc need2) return null;/检测请求量是否大于可用量if (ra Available0 | rb Available1 | rc Available2) return null;/先根据需求修改各类数据,如果后来检测到不存在安全序列,这些数据还会复原Available0 -= ra;Available1 -= rb;Available2 -= rc;need0 -= ra;need1 -= rb;need2 -= rc;allocation0 += ra;allocation1 += rb;allocation2 += rc;/获取安全序列List list = findSaftyLine(processID);/如果安全序列为空,则恢复刚才修改的数据if (list = null) Available0 += ra;Available1 += rb;Available2 += rc;need0 += ra;need1 += rb;need2 += rc;allocation0 -= ra;allocation1 -= rb;allocation2 -= rc;return list;/* * 寻找安全序列 * param proceeeId * return */private static List findSaftyLine(int proceeeId) /得到进程数目int count = Max.size();/标示进程是否安全的数组boolean finish = new booleancount;for (int i = 0; i count; i+) finishi = false;/得到现有各类资源数目Integer work = new IntegerAvailable0, Available1, Available2;int curr = proceeeId;/安全序列List saft = new ArrayList();/寻找 满足条件 ”finishi=false And Needijworkj“(摘自课本) 的进程while (curr count) if (finishcurr = false) Integer need = Need.get(curr);/检测需求量是否符合要求,如果符合,需要修改相应数值if (need0 = work0) & (need1 = work1) & (need2 = work2) Integer allocation = Allocation.get(curr);work0 += allocation0;work1 += allocation1;work2 += allocation2;saft.add(curr); /线程号加入安全序列finishcurr = true; /标示完成curr = 0; /从头搜索数据 else curr+; else curr+;/检测是否有进程不安全for (int i = 0; i count; i+) if (finishi = false) return null;return saft;界面部分:虽然界面不是实验的关键,但在本次实验中,界面担当了很重要作用,银行家算法有可能涉及大量数据,所以这需要一个良好的界面来呈现数据。在该程序中,只需要在表格中输入各类请求资源的数目,并指定相关进程,点击按钮就可的出计算结果,具体实现如下:/* * 初始化数据 */private void initData() int rows = this.jTable1.getRowCount();this.jComboBox1.removeAllItems();for (int i = 0; i rows; i+) this.jComboBox1.addItem(this.jTable1.getValueAt(i, 0);for (int i = 0; i rows; i+) /最大需求表Integer max = Integer.parseInt(this.jTable1.getValueAt(i, 1).toString(), Integer.parseInt(this.jTable1.getValueAt(i, 2).toString(), Integer.parseInt(this.jTable1.getValueAt(i, 3).toString();DoMethod.Max.add(max);/已获得资源表Integer allocation = Integer.parseInt(this.jTable1.getValueAt(i, 4).toString(), Integer.parseInt(this.jTable1.getValueAt(i, 5).toString(), Integer.parseInt(this.jTable1.getValueAt(i, 6).toString();DoMethod.Allocation.add(allocation);/需求表Integer need = Integer.parseInt(this.jTable1.getValueAt(i, 7).toString(), Integer.parseInt(this.jTable1.getValueAt(i, 8).toString(), Integer.parseInt(this.jTable1.getValueAt(i, 9).toString();DoMethod.Need.add(need);/各类资源总量 DoMethod.Available = new IntegerInteger.parseInt(this.a.getText(), Integer.parseInt(this.b.getText(), Integer.parseInt(this.c.getText(); private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) DoMethod.Available = new IntegerInteger.parseInt(this.a.getText(), Integer.parseInt(this.b.getText(), Integer.parseInt(this.c.getText(); /获取请求参数,分别为三类资源的数目int ra_ = Integer.parseInt(this.ra.getText();int rb_ = Integer.parseInt(this.rb.getText();int rc_ = Integer.parseInt(this.rc.getText();/得到请求数据的进程号int processId = this.jComboBox1.getSelectedIndex();
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号