版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、银行家算法解决死锁问题1、 设系统中有3种类型的资源(A,B,C)和5个进程P1、P2、P3、P4、P5,A资源的数量为17,B资源的数量为5,C资源的数量为20。在T0时刻系统状态见下表(T0时刻系统状态表)所示。系统采用银行家算法实施死锁避免策略。(12分)T0时刻系统状态表最大资源需求量已分配资源数量A B CA B CP15 5 92 1 2P25 3 64 0 2P3 4 0 114 0 5P44 2 52 0 4P54 2 43 1 4T0时刻系统状态表P2请求资源(0,3,4)(0,1,1)(1) T0时刻是否为安全状态?若是,请给出安全序列。(2) 在T0时刻若进程P2请求资源
2、(0,3,4),是否能实施资源分配?为什么?(3) 在(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?为什么?(4) 在(3)的基础上,若进程P1请求资源(0,2,0),是否能实施资源分配?为什么?答:当前的系统状态描述为: /资源最大需求数量 max /已分配资源数量 alloc /还需资源数量 Need /资源总量 /系统可用资源向量(1)T0时刻是否为安全状态?若是,请给出安全序列。在T0时刻,由于V(2,3,3)大于等于(C-A)中P5所在行的向量(1,1,0),因此V能满足P5的运行,在P5运行后,系统的状态为: 同样的,在P5运行后,V(5,4,7)也大于等于
3、C-A中P4所在的行(2,2,1),则能满足P4的运行。P4运行后,系统的状态为: 按照上述同样的方法,P4运行后,P3,P2,P1也能按顺序运行。(备注:考试时需要都写出来)。因此,在T0时刻,存在安全序列:P5、P4、P3、P2、P1。T0时刻是安全的。-另外一解法(书中解法)-执行序列选择:首先选择需求资源总数最少的优先。WorkneedAllocWork_allocFinishA B CA B CA B CA B CTP52 3 31 1 03 1 45 4 7TP45 4 72 2 12 0 47 4 11TP37 4 110 0 64 0 511 4 16TP211 4 161 3
4、 44 0 215 4 18TP115 4 183 4 72 1 217 5 20TFinish 都为TRUE得到在T0时刻,安全序列:P5、P4、P3、P2、P1。-另外一解法(书中解法)-(2)在T0时刻若进程P2请求资源(0,3,4),是否能实施资源分配?为什么?P2申请资源(0,3,4),但在C-A中,P2所在行向量是(1,3,4)。对于资源R1,P2的申请超过它所预定的需求。因此,该申请不给予分配。(3)在(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?为什么?A)P4申请(2,0,1)不超过C-A中P4所在行的向量(2,2,1)。B)V(2,3,3)大于等于P
5、4的申请(2,0,1)C)对P4的申请(2,0,1)进行预分配,预分配后,系统的状态为: 可用资源V(0,3,2)大于等于C-A中P4所在的行(0,2,0),因此可以满足P4的运行。P4运行后,系统的状态为: 同样的方法(考试时需要列出),可计算出存在安全序列:P4,P5,P3,P2,P1。因此,预分配后系统的状态是安全状态。对于,P4请求资源(2,0,1),给予分配,分配后的系统新状态为: -另外一解法(书中解法)-A)P4申请(2,0,1)不超过C-A中P4所在行的向量(2,2,1)。B)V(2,3,3)大于等于P4的申请(2,0,1)C)对P4的申请(2,0,1)进行预分配,预分配后,系
6、统的状态为:MaxallocNeedavailableA B CA B CA B CA B CP15 5 92 1 23 4 70 3 2(2 3 3)P25 3 64 0 21 3 4P34 0 114 0 50 0 6P44 2 54 0 5(2 0 4)0 2 0(2 2 1)P54 2 43 1 41 1 0注意:()内的值为旧值安全性算法:WorkneedAllocWork_allocFinishA B CA B CA B CA B CP40 3 20 2 04 0 54 3 7TP54 3 71 1 03 1 47 4 11TP37 4 110 0 64 0 511 4 16TP2
7、11 4 161 3 44 0 215 4 18TP115 4 183 4 72 1 217 5 20TFinish 都为TRUE在P4申请资源(2,0,1),给予分配后,可以得到安全序列:P5、P4、P3、P2、P1。P4申请资源(2,0,1)后,系统状态为:MaxallocNeedavailableA B CA B CA B CA B CP15 5 92 1 23 4 70 3 2P25 3 64 0 21 3 4P34 0 114 0 50 0 6P44 2 54 0 50 2 0P54 2 43 1 41 1 0-另外一解法(书中解法)-(4)在(3)的基础上,若进程P1请求资源(0,
8、2,0),是否能实施资源分配?为什么进程P1请求资源(0,2,0)A)P1申请(0,2,0)不超过C-A中P1所在行的向量(3,4,7)。B)V(0,3,2)大于等于P1的申请(0,2,0)C)对P1的申请(0,2,0)进行预分配,预分配后,系统的状态为: V(0,2,1)不大于等于P1到P5任一进程在C-A中的向量,因此系统进行预分配后处于不安全状态。对于P1申请资源(,),不给予分配。-另外一解法(书中解法)-进程P1请求资源(0,2,0)A)P1申请(0,2,0)不超过C-A中P1所在行的向量(3,4,7)。B)V(0,3,2)大于等于P1的申请(0,2,0)C)对P1的申请(0,2,0
9、)进行预分配,预分配后,系统的状态为:MaxallocNeedavailableA B CA B CA B CA B CP15 5 92 3 2(2 1 2)3 2 7(3 4 7)0 1 2(0 3 2)P25 3 64 0 21 3 4P34 0 114 0 50 0 6P44 2 54 0 50 2 0P54 2 43 1 41 1 0注意:()内的值为旧值有效资源不能满足所有进程的Need值,因此对P1的申请进行了分配后,系统处于不安全状态。-另外一解法(书中解法)-一.概念引入银行家算法( banker's algorithm )由 Dijkstra于1965提出,关键是将死
10、锁的问题演示为一个银行家贷款的模型,由于能用于银行系统的现金贷款而出名。一个银行家向一群客户发放信用卡,每个客户有不同的信用额度。每个客户可以提出信用额度内的任意额度的请求,直到额度用完后再一次性还款。银行家承诺每个客户最终都能获得自己需要的额度。所谓“最终”,是说银行家可以先挂起某个额度请求较大的客户的请求,优先满足小额度的请求,等小额度的请求还款后,再处理挂起的请求。这样,资金能够永远流通。所以银行家算法其核心是:保证银行家系统的资源数至少不小于一个客户的所需要的资源数。银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但银行家算法在系统在进行资源分配之前
11、(并不是真的不分配,这样就没法做了,只不过是试探性分配,不满足的话再恢复),应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。安全序列是指存在一个进程序列P1,Pn是安全的,不会死锁(至少两个线程占有某资源A,但是都不满足,剩余的资源A分配给谁仍然无法满足),安全状态如果存在一个由系统中所有进程构成的安全序列P1,Pn,则系统处于安全状态,安全状态一定是没有死锁发生;不安全状态不存在一个安全序列,不安全状态不一定导致死锁。本算法在理论上是出色的,能非常有效地避免
12、死锁,但从某种意义上说,它缺乏实用价值,因为很少有进程能够在运行前就知道其所需资源的最大值,且进程数也不是固定的,往往在不断地变化(如新用户登录或退出),况且原来可用的资源也可能突然间变成不可用(如打印机、磁带机可能被损坏)。二.算法原理银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。每分配一次资源就测试一次是否安全,不是资源全部就位后才测试,注意理解checkError函数的循环顺序。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定:当一个顾客对资金的最大需求量不
13、超过银行家现有的资金时就可接纳该顾客(试探性分配)顾客可以分期贷款,但贷款的总数不能超过最大需求量(可能一次并不能满足所需要的全部资源)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款(不存在死锁)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金(运行后释放)操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
14、若超过则拒绝分配资源,若能存在安全状态,则按当前的申请量分配资源,否则也要推迟分配。三.算法的Java实现 1: import java.util.Arrays; 2: import javax.swing.JOptionPane; 3: 4: public class Banker 5: 6: /* 7: * 资源向量必须全部设置成static,因为可能 8: * 同一个线程多次输入才满足条件 9: */ 10: /每个线程需要的资源数 11: static int max = 7, 5, 3 , 3, 2, 2 , 9, 0, 2 , 12: 2, 2, 2 , 4, 3, 3 ; 13:
15、 /系统可用资源数 14: static int avaliable = 10,5,7; 15: /已经分配资源 16: static int allocation = 0, 0, 0 , 0, 0, 0 , 0, 0, 0 , 17: 0, 0, 0 , 0, 0, 0 ; 18: /每个进程还需要的资源数,初试一个资源也没分配;实际上应该等于max-avaliable 19: static int need = Arrays.copyOf(max,max.length); 20: /每次申请的资源数 21: static int request = 0, 0, 0 ; 22: /NUM个线
16、程,N种资源 23: static final int NUM = 5, N = 3; 24: static Function function = new Function(); 25: 26: public static void main(String args) 27: JOptionPane jpane = new JOptionPane(); 28: 29: /是否进行模拟标志,没有布尔,因为从JOpotionpane输入 30: int flag = 1; 31: 32: while(1=flag) 33: /* 34: * 用与判断线程号是否合法 35: * 需要放在while
17、内部,防止下次继续模拟时i还是上次输入的 36: */ 37: int i = -1; 38: while(i<0|i>=NUM) 39: String str = jpane.showInputDialog("输入申请资源的线程号(0到4):"); 40: i = Integer.parseInt(str); 41: if(i<0|i>=NUM) 42: JOptionPane.showMessageDialog(jpane, "输入的线程号不合法!"); 43: 44: 45: /资源输入有效性标志 46: boolean t
18、ag = true; 47: for(int j=0; j<N; j+) 48: String str = jpane.showInputDialog("输入线程"+i+"所申请的资源"+j+"数目:"); 49: requestj = Integer.parseInt(str); 50: /有效性检查 51: if(requestj>needij) 52: JOptionPane.showMessageDialog(jpane, "输入的资源数大于需要资源数!"); 53: tag = false;
19、54: break; 55: else 56: if(requestj>avaliablej) 57: JOptionPane.showMessageDialog(jpane, "输入的资源数大于可用资源数!"); 58: tag = false; 59: break; 60: 61: 62: 63: /是否存在安全序列 64: boolean vis = true; 65: if(tag) 66: function.allocateK(i); 67: vis = function.checkError(i); 68: if(false=vis) 69: /上面调用了
20、allocateK,所以不仅需要释放,还需要恢复 70: function.freeKAndRestore(i); 71: else 72: /测试是否全部资源到位 73: boolean f = function.checkRun(i); 74: if(true=f) 75: JOptionPane.showMessageDialog(jpane 76: ,"进程"+i+"全部资源到位!"+"n"+"即将释放所占用资源"); 77: function.freeKNotRestore(i); 78: 79: 80:
21、 else 81: /实际上没必要清空,因为该数组是输入的,只为了展示一种良好习惯 82: Arrays.fill(request,0); 83: 84: String str = JOptionPane.showInputDialog("是否继续模拟(1表示是,0退出)?"); 85: flag = Integer.parseInt(str); 86: 87: 88: 89: 90: class Function 91: /* 92: * 实际上完全是静态的,没必要新new一个Banker 93: */ 94: Banker banker = new Banker();
22、95: /为线程k分配资源 96: public void allocateK(int k) 97: for(int i=0; i<banker.N; i+) 98: banker.avaliablei -= banker.requesti; 99: banker.needki -= banker.requesti;100: banker.allocationki += banker.requesti;101: 102: 103: public boolean checkError(int i) 104: int work = 0;105: /存储所有线程是否安全106: boolean
23、 finish = new booleanbanker.NUM;107: Arrays.fill(finish,false);108: /存储一个安全序列109: int temp = new intbanker.NUM;110: Arrays.fill(temp,0);111: /temp数组下标112: int t = 0;113: 114: /线程号参数是i115: for(int j=0; j<banker.N; j+) 116: work = banker.avaliablej;117: int k = i;118: 119: while(k<banker.NUM) 120: if(finishk=false&&work>=banker.needkj) 121: /*122: * 注意不是max数组,因为此时线程k123: * 所需资源不一定完全就位124: * 加的是allocation,因为进行此项检查前先试探性地125: * 分配给线程k资源了126: */127: /满足该线程,回收该项资源,看是否满足其它线程128: work += banker.allocationkj;129: finishk = true;130: tempt+ = k;131: k = 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 损害赔偿和解协议书3篇
- 招标文件范本的内容说明3篇
- 工业材料采购规定3篇
- 房屋买卖合同正规格式3篇
- 工伤全权代理书3篇
- 房屋买卖委托公证指南3篇
- 招标编号修改优化招标过程的关键步骤3篇
- 开庭委托书写作技巧大放送3篇
- 教育培训部门主管派遣服务合同3篇
- 招标文件附件格式创新方法3篇
- DB3502∕Z 5058-2020 厦门市城市轨道交通工程预算定额(土建工程)
- 《桥梁工程计算书》word版
- (完整版)ECRS培训课件
- 《激光原理》复习解析
- 增值税发票税控系统专用设备注销发行登记表
- 质量管理体系各条款的审核重点
- 聚丙烯化学品安全技术说明书(MSDS)
- 蔬菜采购合同水果蔬菜采购合同
- CX-TGK01C型微电脑时间温度控制开关使用说明书
- 电仪工段工段长职位说明书
- 简易送货单EXCEL打印模板
评论
0/150
提交评论