完整版银行家算法的模拟实现—试验报告_第1页
完整版银行家算法的模拟实现—试验报告_第2页
完整版银行家算法的模拟实现—试验报告_第3页
完整版银行家算法的模拟实现—试验报告_第4页
完整版银行家算法的模拟实现—试验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、银行家算法的模拟实现?-实验报告题 目:银彳丁家算法的模拟实现专 业:班 级:组 员:_指导老师:一、实验目的死锁会引起计算机工作僵死, 因此操作系统中必须预防. 本实验的目的在于让学生独立 的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序, 了解死锁产生的条件和 原因,并采用银行家算法有效地预防死锁的发生,以加深对课堂上所讲授的知识的理解.、实验内容模拟实现银行家算法实现死锁预防.要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵 Need和可利用资源向量 Availa

2、ble .三、实验分析过程1、整个银行家算法的思路.先对用户提出的请求进行合法性检查,再进行预分配,利用平安性检查算法进行平安性检查.1) 进程一开始向系统提出最大需求量.2) 进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.3) 假设正常,那么判断该进程所需剩余剩余量 (包括本次申请)是否超出系统所掌握的剩余资源量,假设不超出,那么分配,否那么等待2、算法用到的主要数据结构和(1 )、(2 )、(3 )、(4 )、(5)、(6 )、(7 )、可利用资源向量最大需求矩阵已分配矩阵还需求矩阵申请各类资源数量工作向量INTINTINTINTC语言说明.AVAILABLEM M

3、为资源的类型.MAXNM N为进程的数量.ALLOCA TIONNMNEEDNNint Requestx; / int Workx;int Finishy; /表示系统是否有足够的资源分配给进程,0为否,非0为是3、银行家算法 (主程序)(1 )、系统初始化.输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等(2) 、输入用户的请求三元组(I, J, K),为进程I申请K个J类资源.(3) 、检查用户的请求是否小于还需求的数量,条件是K<=NEEDI,J.如果条件不符那么提示重新输入,即不允许索取大于需求量(4) 、检查用户的请求是否小于系统中的可利用资源数量,条件

4、是 K<=AVALIABLEI,J.如果条件不符那么申请失败,阻塞该进程,重新进行进程动态资源申请(使用got.语句)(5) 、进行资源的预分配,语句如下:AVALIBLEIJ= A VALIBLEIJ-K ;ALLOCATIONIJ= ALLOCATIONIJ+K ;NEEDIJ=NEEDIJ-K ;(6)、系统调用平安性检查算法(checksafe()函数)进行检查,如果检查通过,那么不用回收,否那么进行回收,进程资源申请失败进入等待.4、平安性检查算法(checksafe()子函数)(1 )、设置两个临时变量.FINISHN记录进程模拟执行的结束状态,初值为 0,如果可以模拟执行结

5、束,那么可 设为1,也可设为其它非零值以表示执行的先后次序.WORKM记录模拟执行中资源的回收情况,初值为 AVAILABLEM的值.(2) 、在进程中查找符合以下条件的进程.条件 1: FINISHI=0条件 2: NEEDIJ =WORKJ(3) 、如果查找成功那么进行资源的模拟回收,语句如下:WORKJ=WORKJ+ALLOCA TIONIJ;FINISHI=1 或查找到的顺序号(4) 、如果查找不成功,那么检查所有进程的FINISH,如果有一个为 0,那么系统不为0,返回不成功标志.否那么返回成功标志.四、系统流程图五、程序源代码#include <iostream.h>#

6、include<stdio.h>#include<stdlib.h>const unsigned short c=3;/ 资源类数 const unsigned short t=5;/ 进程数 void print();/用于打印输出表格的函数 void input();/用于输入的函数 void tryfenpei(int i);/ 试分配函数; void refenpei(int i);/ 恢复数据函数 void checksafe(int s);/ 平安检测函数 int tempt;int workc;/定义初始化数组int needtc,requestc,ava

7、ilablec;int maxtc=(3, 5, 7 ,9 ,11,6 ,8 ,2 ,9, 5,6 ,3 ,5 ,7 ,4;int allocationtc=1 ,2 ,5 ,4, 8,5 ,4, 1 ,8 ,3 ,3 ,2 ,4, 3, 1;int totalc=(17,21,25;int in;/用户选择的进程号/*main 函数*/int main(int argc,char *argv)int i;char ch='Y'int l=0,m=0,a;for( i=0;i<t;i+)for(int j=0;j<c;j+)needij=maxij-allocati

8、onij;for( m=0;m<c;m+)a=0;for(int l=0;l<t;l+)a+=allocationlm;availablem=totalm-a;do if(ch='Y'|ch='y')cout<<"ok,现在开始进入实验"<<endl;cout<<"请输入需要请求的进程号(0-4):"while(cin>>in)if(!(0<=in&&in<=4)cout<<"这里没有该进程,请重新输入"

9、<<endl;else break;)cout«"您输入的是 "«"p"«in«""«" 进程"«endl;cout«"该进程需求量为:for(i=0;i<c;i+)needini=maxini-allocationini;cout«needini«""cout«endl;cout«endl;cout«"请输入请求资源向量:输入格式为xfo

10、r(i=0;i<c;i+)while(cin»requesti)(if(requesti<0) cout«"sorry,输入的数字无效"«endl;else if(requesti>needini)cout«"超出进程需求量"«endl«endl;if(requesti>availablei)cout«"系统没有足够多的可用资源量满足进程需要 "«endl«endl;else break;)cout«"

11、输入成功,您输入的是: "«requestO«"" «request1«" "«request2;cout«"等待已久的银行家算法开始执行"«endl;tryfe叩ei(in);/分配函数cout«"试分配完成"«endl;cout«"现在进入平安性检测"«endl;checksafe(in);/平安性检测函数cout«"您还想继续银行家算法的实验吗 ( y

12、 一继续n终止)else if(ch='N'|ch='n')(cout«"感谢您的使用,Bye "«endl«"退出 ing"«endl;break;elsecout«"输出无效!请重新输入 "«endl;)while (cin»ch);return 0;/*输出函数*/void print()(int i,j;cout<<"更新数据中.<<endl;cout<<"|1111|&

13、quot;<<endl;cout<<"|1最大需求矩阵|已分配矩阵-|-需求矩阵-|可利用资源-|"<<endl;cout<<"| 资源 | Max | Allocation Need | available |"<<endl;cout<<"| A B C | A B C | A B C | A B C |"<<endl;cout<<"| 进程 |"<<endl;cout<<"|1111

14、|"<<endl;for(i=0;i<5;i+)(cout<<"| p"<<i<<"| "for(j=0;j<3;j+) cout<<maxij<< " cout<<" | "for(j=0;j<3;j+)cout<<" "<<allocationij; cout<<" | "for(j=0;j<3;j+)cout<<&q

15、uot; "<<needij;cout<<" |"if(i=0)for(j=0;j<3;j+)cout<<" "<<availablej; cout<<"|"if(i>0)cout<<"|" cout<<endl; cout<<"|1111|"<<endl;/*试分配函数*/void tryfenpei(int i)for(int f=0;f<c;f+)avai

16、lablef=availablef-requestf;allocationif=allocationif+requestf;needif=needif-requestf;/*恢复数据函数*/void refenpei(int i)(for(int f=0;f<c;f+)(availablef=availablef+requestf;allocationif=allocationif-requestf;needif=needif+requestf;int com(int *p,int *q)(int i;for(i=0;i<c;i+)if(pi>qi)return 0;retu

17、rn 1;/*平安检测函数*/void checksafe(int s)(int flag,tempt,i,j,l,k=0;bool finisht;for(i=0;i<t;i+)finishi=false;for(j=0;j<c;j+)workj=availablej;cout<<"|"<<endl;cout<<"| resource |-Work+Allocation-|-Finish-|"<<endl;cout<<"| | A B C | T/F |"<

18、;<endl;cout<<"|programme |"<<endl;cout<<"|"<<endl;for(i=0;i<t;i+)(l=0;for(j=0;j<c;j+)(if(needij>workj)l=1;break;if(finishi=false&&l=0)(cout<<"| p"<<i<<"| "for(j=0;j<c;j+)(workj=workj+allocationij

19、;if(workj>9)cout<<""<<workj<<""elsecout<<""<<workj<<""cout<<""cout<<"|"cout<<" "finishi=true;cout<<"true "cout<<"|"tempk=i;/cout<<'

20、temp="<<tempk<<endl;k+;i=-1;从用户选择的进程开始对每个进程都要检测cout<<endl;cout<<"|11|"<<endl<<endl;for(i=0;i<t;i+)(if(finishi=false)flag=1;if(flag=1)(cout<<"系统不平安!本次资源申请不成功感!"<<endl;cout<<"正在恢复原来的数据 ."<<endl;refenpei(i

21、n);cout<<"恢复数据成功!正在打印输出."<<endl;print();else(cout<<"找到一个平安系列:"for(i=0;i<t;i+)cout<<"P"<<tempi<<->cout<<endl<<"已通过平安性测试!"<<endl<<endl<<endl;cout<<"开始给第"<<"p"

22、<<in<<""<<进程分配资源."<<endl;cout<<"分配完成!打印输出."<<endl<<endl;print();cout<<endl;五、程序运行结果及分析1、运行结果输入初值,进行平安性测试,结果平安序列,依次为P4-P0-P1-P2-P3 分配资源:1 *C:Program FilesMicrosoft Visual StudioMyProjectElDebugl.exeB>进, 蜜t4为 绞请P量 署秉贺入程I resou

23、rce *-Work+ftllocation-!Finih-I f : A B C :T/F 1! : !¥13 直41口王口王4 4玉:1的 源您 资 求成女 请块元入一入成配讲 ?分在一JM3检性圣4 3等待已久的银行家算法开始执行资源缺乏,无法继续实验:9157.5!1 tpue !16910:true !1 1B1?15* true1 141823! true1 1721251 trueI吗>:验-4 实<0 曹号 法金*术 算音进6&试1> 续HIW秉 ;4希麝需 想线入程 您ok腹渗耍聚著蠡魏菁矗矗满足讲程需要%系统没有足够多的可用资源量满足进程

24、需要系统没有足够多的可用资源量满足进程需要2、出现问题及解决方案本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设 计,尽可能使程序设计的更加完美.在长期的设计调试过程中遇到过许多问题,通过网 上搜索、查询资料、调试试验等方法一一解决.下面大致罗列一些主要问题:(1 )、关于某些判断算法优劣问题:在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时 有很多方法,而有的算法可以更节省时间.如下平安性算法中寻找寻找符合 Finishi=0条件的进程的例子:/*算法一:for (j=0; j<m; j+)if (Workj>=Needij) coun

25、ter=counter+1;/ 记数if(counter=m)( -*/ /算法二:for (j=0; j<m; j+)if (Workj>=Needij); / 可用大于等于需求else(counter=1;break;if(counter!=1)( -显然算法二要优于算法一.本程序中还有很多类似的地方.这里主要考虑的是一个 程序的优化设计问题.(2)、关于某些系统函数调用时的执行顺序:在调用一些系统函数如getch()、system("pause")等时发现其执行顺序的一些问题.如类似:cout<<" ="<<en

26、dl;cout<<" nnn"<<endl;system("pause");/ 暂停调试时发现此时:在Microsoft Visual C+ 6.0中先执行system("pause")再输出显 示,而在调试器 Bloodshed Dev-C+中那么顺序执行;但当把 cout<<" nnn"<<endl;改 为cout<<endl<<endl<<endl;其他不变时,那么在两中调试器中均为顺序执行,即先显 示后暂停.查找了一下相关帮

27、助:在OSTREAM.H中有这样的一个 inline函数:inline _CRTIMP ostream& _cdecl endl(ostream& _outs) ( return _outs << 'n' << flush; 也就是说endl= return _outs << 'n' << flush;endl除了写'n'进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或 屏幕.如果考虑效率就用'n'(3 )、关于设置暂停的方法:在有些地方需要暂停一下以便于用户查看信息等,总结了下大致可用以下几中方法:方法一:#inclu

温馨提示

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

评论

0/150

提交评论