银行家算法课程设计_第1页
银行家算法课程设计_第2页
银行家算法课程设计_第3页
银行家算法课程设计_第4页
银行家算法课程设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统课程设计银行家算法专 业:网络工程学 号:110613119姓 名: 伊 兵指导老师: 姜 红一、实验名称: 模拟实现银行家算法二、实验目的:用程序语言模拟实现银行家算法。银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。三、问题分析与设计1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。2、银行家算法步骤:(1)如果

2、Requestior =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果Requestor=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:     Available=Available-Requesti;     Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统

3、是否处于安全状态。3、安全性算法步骤:(1)设置两个向量工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi=false,当有足够资源分配给进程时,令Finishi=true。(2)从进程集合中找到一个能满足下述条件的进程:Finishi=falseNeed<or=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+All

4、ocation;Finishi=true; 转向步骤(2)。(4)如果所有进程的Finishi=true,则表示系统处于安全状态;否则,系统处于不安全状态。4、流程图:系统主要过程流程图:银行家算法流程图:安全性算法流程图:5、实现过程:一、开发环境编程语言:java开发环境:windows & eclipse二、开发过程:1、display()用于初始化资源矩阵和初始化进程,available、allocation、need、resource、process。2、print(int)用于打印T时刻的资源矩阵。3、cal()用于进行安全性算法。4、changeStatu()通过requ

5、est向量改变资源使用情况并进行安全性检测。5、main()用于初始化程序。三 、 关键代码 1.银行家算法while(flag)int req=new int5;System.out.print("请输入您要请求资源的 编号:");int choose=scan.nextInt();System.out.print("请输入该进程的请求向量:");for (int i = 0; i < resource; i+) reqi=scan.nextInt();/将请求向量存入数组boolean flag1 = (req0<=needchoose0

6、&&req1<=needchoose1&&req2<=needchoose2&&req3<=needchoose3&&req4<=needchoose4);boolean flag2 = (req0<=available0&&req1<=available1&&req2<=available2&&req3<=available3&&req4<=available4); System.out.println(flag

7、1); System.out.println(flag2);if(flag1)if(flag2)/判断请求向量是否小于可用资源数 for (int i = 0; i < resource; i+) availablei=availablei-reqi; /改变可用资源数 allocationchoosei=allocationchoosei+reqi; needchoosei=needchoosei-reqi; /改变所需资源数3int work=new int5;/资源种类数量大小的数组 boolean finish1=new booleanprocess; /设置finish标志数组

8、 for (int i = 0; i < process; i+) finish1i=false;int array1=new intprocess;int num1=1;int count11=0; while(num1<process)for (int i = 0; i < process; i+) if(finish1i=false)if(needi0<=work0&&needi1<=work1&&needi2<=work0&&needi3<= work3&&needi4<=w

9、ork4)for (int j2 = 0; j2 < resource; j2+) availablej2=availablej2+allocationij2; availablej2 = workj2; finish1i=true; array1count11=i; count11+;num1+; /安全性算法3int count2=0;for (int i = 0; i < array1.length; i+) if(finish1i=true)count2+; /判断有多少个进程已经成功得到所需进程并结束if(count2=process)System.out.println

10、("存在一个安全序列:");for (int i = 0; i < array1.length; i+) System.out.print("P"+array1i+""); /判断整个进程序列书否全部完成 并打印输出安全序列elseSystem.out.println("系统处于不安全状态!");System.out.println();elseSystem.out.println("资源不够清等待!");/if结束elseSystem.out.println("请求资源已超过所

11、需资源!");/while结束/end of method changeStatupublic static void main(String args) throws IOException work w = new work(); int count2 = 1; w.display(); w.print(count2+); w.cal(); w.changeStatu(); /end of method main2.安全性算法boolean finish = new booleanprocess;for (int i = 0; i < process; i+) finish

12、i=false;/初始化数组finishint array = new intprocess;/定义一个数组保存安全序列int num=1;int count1=1; while(num<process)for (int i = 0; i < process; i+) if(finishi=false)if(needi0<=available0&&needi1<=available1&&needi2<=available0&&needi3<=available3&&needi4<=avai

13、lable4)for (int j2 = 0; j2 < resource; j2+) availablej2=availablej2+allocationij2;finishi=true;arraycount1-1=i;count1+;num+; /安全性算法3、实验结果6、程序清单package banker;import java.io.IOException;import java.util.Scanner;public class work public int resource; int process; int available; int max; int allocat

14、ion; int need;/定义基本的数据 boolean flag1; boolean flag2; Scanner scan = new Scanner(System.in);public void display()System.out.println("tt"+"操作系统课程设计-银行家算法");System.out.print("请输入进程数:");process = scan.nextInt();System.out.print("请输入资源种类数:");resource = scan.nextInt

15、();System.out.print("请输入可用资源数:");available = new int5;for(int i = 0;i<resource;i+)availablei = scan.nextInt();System.out.println("请输入资源分配矩阵");allocation = new int 55;for(int i = 0;i<process;i+)System.out.print("请输入"+ i + "号进程已分配资源数:");for(int j =0;j<r

16、esource;j+)allocationij = scan.nextInt();/end of resource /end of processneed = new int55;for(int i = 0;i<process;i+)System.out.print("请输入"+ i + "号进程还需要资源数:");for(int j =0;j<resource;j+)needij = scan.nextInt();/end of resource /end of processmax = new int55;for(int i = 0;i&

17、lt;process;i+)System.out.print("请输入"+ i + "号进程最大需求资源数:");for(int j = 0;j<resource;j+)maxij = scan.nextInt(); / end of resource/ end of for process /end of method displaypublic void print(int g)System.out.println();/* * 打印资源分配表 * */System.out.println("T"+g+"时刻的资源

18、分配矩阵");System.out.println("进程tmaxttallocationtneedttavailable");System.out.print("P0 ");for (int i = 0; i <resource; i+) System.out.print(max0i+" ");System.out.print(" ");for (int i = 0; i <resource; i+) System.out.print(allocation0i+" ");

19、System.out.print(" ");for (int i = 0; i <resource; i+) System.out.print(need0i+" ");System.out.print(" ");for (int i = 0; i <resource; i+) System.out.print(availablei+" ");System.out.println();for (int i = 1; i < process; i+) System.out.print("P&

20、quot;+i+" ");for (int j = 0; j < resource; j+) System.out.print(maxij+" ");System.out.print(" ");for (int j = 0; j < resource; j+) System.out.print(allocationij+" ");System.out.print(" ");for (int j = 0; j < resource; j+) System.out.print(ne

21、edij+" ");System.out.println(); /此段程序输出已输入数据s /end of method printpublic void cal()/* * 检查安全序列 * */boolean finish = new booleanprocess;for (int i = 0; i < process; i+) finishi=false;/初始化数组finishint array = new intprocess;/定义一个数组保存安全序列int num=1;int count1=1; while(num<process)for (int

22、 i = 0; i < process; i+) if(finishi=false)if(needi0<=available0&&needi1<=available1&&needi2<=available0&&needi3<=available3&&needi4<=available4)for (int j2 = 0; j2 < resource; j2+) availablej2=availablej2+allocationij2;finishi=true;arraycount1-1=i

23、;count1+;num+; /安全性算法int count=0;for (int i = 0; i < array.length; i+) if(finishi=true)count+;/检查已完成的进程数目if(count=process)System.out.println("存在一个安全序列:");for (int i = 0; i < array.length; i+) System.out.print("P"+arrayi+"");/输出安全序列elseSystem.out.println("系统处于

24、不安全状态!");System.out.println();/end of calpublic void prinSecurityList()/end of method prinSecurityListpublic void changeStatu()boolean flag=true;while(flag)int req=new int5;System.out.print("请输入您要请求资源的 编号:");int choose=scan.nextInt();System.out.print("请输入该进程的请求向量:");for (int

25、 i = 0; i < resource; i+) reqi=scan.nextInt();/将请求向量存入数组boolean flag1 = (req0<=needchoose0&&req1<=needchoose1&&req2<=needchoose2&&req3<=needchoose3&&req4<=needchoose4);boolean flag2 = (req0<=available0&&req1<=available1&&req2<

26、;=available2&&req3<=available3&&req4<=available4); System.out.println(flag1); System.out.println(flag2);if(flag1)if(flag2)/判断请求向量是否小于可用资源数 for (int i = 0; i < resource; i+) availablei=availablei-reqi; /改变可用资源数 分配资源allocationchoosei=allocationchoosei+reqi; /由于已分配资源 needchoose

27、i=needchoosei-reqi; /改变所需资源数3int work=new int5;/资源种类数量大小的数组 用来构建available的数boolean finish1=new booleanprocess; /设置finish标志数组 for (int i = 0; i < process; i+) finish1i=false;int array1=new intprocess;int num1=1;int count11=0; while(num1<process)for (int i = 0; i < process; i+) if(finish1i=false)if(needi0<=work0&&needi1<=work1&&needi2<=work0&&needi3<=work3&&needi4<=work4)for (int j2 = 0; j2 < resource; j2+) availablej2=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论