您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统原理-Linux环境下的银行家算法实验
软件学院实验报告课程名称:操作系统原理实验项目:银行家算法实验室:耘慧楼402姓名:于思淼学号:1220010523专业班级:软件12-5班实验时间:2014/12/20实验成绩评阅教师一、实验目的及要求1.进一步理解利用银行家算法避免死锁的问题;2.在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性;3.理解和掌握安全序列、安全性算法。二、实验性质验证性三、实验学时4学时四、实验环境1.实验环境:Linux系统开发环境2.知识准备:(1)银行家算法基本算法概念(2)C语言基本语法及设计理念五、实验内容及步骤实验内容:1.了解和理解死锁;2.理解利用银行家算法避免死锁的原理;3.会使用某种编程语言。1.安全状态指系统能按照某种顺序如P1,P2,…,Pn(称为P1,P2,…,Pn序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。2.银行家算法假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。系统按下述步骤进行安全检查:(1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,Pi阻塞等待。(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:Available[j]∶=Available[j]-Requesti[j];Allocation[i,j]∶=Allocation[i,j]+Requesti[j];Need[i,j]∶=Need[i,j]-Requesti[j];(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。3.安全性算法(1)设置两个向量:①工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work∶=Available;②Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]∶=false;当有足够资源分配给进程时,再令Finish[i]∶=true。(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false;②Need[i,j]≤Work[j];若找到,执行步骤(3),否则,执行步骤(4)。(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]∶=Work[i]+Allocation[i,j];Finish[i]∶=true;gotostep2;(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态4.实验步骤(1)参考图1所示流程图编写安全性算法。图1:安全性算法流程图(2)编写统一的输出格式。每次提出申请之后输出申请成功与否的结果。如果成功还需要输出变化前后的各种数据,并且输出安全序列。(3)参考图1所示流程图编写银行家算法。(4)编写主函数来循环调用银行家算法。六、实验数据及结果分析1.Linux实验平台下安装eclipse开发环境图2:eclipse开发环境2.开始界面图3:开始界面3.初始化并打印图4:初始化并打印4.资源分配情况图5.资源分配情况5.用例测试a:进程1发出请求Request(2,1,2)——RequestNeed,不予分配。图6:运行结果16.用例测试b:进程0发出请求Request(2,2,2)——RequestAvailable,不予分配。图7:运行结果27.用例测试c:进程1发出请求Request(1,0,1)——可以分配。图8:运行结果38.用例测试d:进程0发出请求Request(1,0,1)——系统不安全。图9:运行结果49.输入测试a:如果所输入的要分配资源的进程号不在存在的进程,则报错请求重新输入。图10:运行结果5七、实验总结在银行家算法这个系统之中,所采用的数据结构应是最基本的部分。银行家算法的数据结构我们采用了一维数组与二维数组来存储,比如最大需求量Max[][]、已分配资源数Allocation[][]、仍需求资源数Need[][]、以及系统可利用的资源数、申请各类资源等数组。附录源程序清单packagebank;importjava.util.Scanner;publicclassTest{intno1,no2;staticintMax[][];//最大需求staticintAllocation[][];//已分配资源数staticintNeed[][];//仍需资源数staticintAvailable[];//可利用资源数staticStringname1[];staticStringname2[];staticboolean[]Finish;staticint[]temp={0};//存放安全序列staticintwork[];staticint[]Request;Scannerinput=newScanner(System.in);publicstaticvoidmain(String[]args){Testt=newTest();t.printFrame();//t.print();t.Safty();t.judge();}/*输入初始化数据*/publicvoidprintFrame(){System.out.println(*****************************************************);System.out.println(**);System.out.println(*银行家算法设计与实现*);System.out.println(**);System.out.println(*****************************************************);System.out.print(请输入系统中进程的个数:);no1=input.nextInt();System.out.print(请输入资源的种类数:);no2=input.nextInt();Max=newint[no1][no2];Allocation=newint[no1][no2];Need=newint[no1][no2];Available=newint[no2];name1=newString[no1];name2=newString[no2];intsum[]=newint[3];for(inti=0;ino1;i++){System.out.print(请输入进程+i+的名字:);name1[i]=input.next();}for(inti=0;ino2;i++){System.out.print(请输入资源+i+的名字:);name2[i]=input.next();}for(inti=0;ino1;i++){for(intj=0;jno2;j++){System.out.print(请输入进程+name1[i]+的+name2[j]+类资源最大需求量:);Max[i][j]=input.nextInt();}}for(inti=0;ino1;i++){for(intj=0;jno2;j++){System.out.print(请输入进程+name1[i]+的+name2[j]+类资源已占有资源量:);Allocation[i][j]=input.nextInt();Need[i][j]=Max[i][j]-Allocation[i][j];}}for(inti=0;ino2;i++){System.out.print(请输入类资源+name2[i]+的可利用资源数:);Available[i]=input.nextInt();}//for(inti=0;ino2;i++)//算出资源分配后,系统的可利用资源数//{//for(intj=0;jno1;j++)//{sum[i]+=Allocation[j][i];}//}for(inti=0;ino2;i++){Available[i]=Available[i]-sum[i];}}/*打印輸出*/publicvoidprint(){System.out.println(**************此时刻资源分配情况**************);System.out.println(NumberNameMaxAllocationNeed);for(inti=0;ino1;i++){System.out.print(+i+);System.out.print(name1[i]+);for(intj=0;jno2;j++){System.out.print(Max[i][j]+);}for(intj=0;jno2;j++){System.out.print(+Allocation[i][j]);}for(intj=0;jno2;j++){System.out.print(+Need[i][j]);}System.out.println();}System.out.print(各个类资源可利用的资源数分别为:);for(intj=0;jno2;j++){System.out.print(+Available[j]);}System.out.println();}/***进行安全性检测*/publicvoidSafty(){Finish=newboolean[no1];temp=newint[no1];inti,k=0,m,apply,j;//k为安全序列的序列数intflag=0;work=newint[no2];for(i=0;ino2;i++){work[i]=Available[i];}for(i=0;ino1;i++)//当前执行换后,重第一个开始检测{apply=0;for(j=0;jno2;j++){if(Finish[i]==false&&Need[i][j]=work[j])//{apply++;if(apply==no2){for(m=0;mno2;m++)work[m]=work[m]+Allocation[i][m];//变分配数Finish[i]=true;temp[k]=i+1;//保存安全序列i=-1;//k++;flag++;}}}}for(i=0;ino2;i++){if(Finish[i]==false){System.out.println(系统不安全!);}else{System.out.print(系统是安全的,安全序列为:);for(i=0;ino1;i++)//输出运行进程数组{System.out.print(temp[i]+--);}System.out.println();print();}}}/*进行资源分配*/publicvoidchangdata(inti){intj;for(j=0;jno2;j++){Available[j]=Available[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}}/*利用银行家算法对申请资源对进行判定*/voidjudge(){Request=newint[no2];charch='y';inti=0,j=0;System.out.print(请输入您要分配的资源进程号:);for(j=0;j10;j++){i=input.nextInt();if(ino1){System.out.println(输入错误,请重新输入:);continue;}
本文标题:操作系统原理-Linux环境下的银行家算法实验
链接地址:https://www.777doc.com/doc-3836472 .html