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

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上银行家算法的模拟实现一、 实验题目:模拟实现银行家算法的处理过程二、 实验目的:银行家算法是避免死锁的代表性算法。本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。然后依照本实习,自行设计模拟程序。三、 实验原理:1. 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进

2、程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。2. 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。 不安全状态:不存在一个安全序列。不安全状态一定导致死锁。安全序列:一个进程序列P1,Pn是安全的,如果对于每一个进程Pi(1in),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和

3、。3. 设requesti为进程pi的请求向量,如果requestij=K,表示进程pi需要K个Rj资源。当系统发出请求后,系统按下述步骤开始检查: 1)如果requestij<=needij,转向步骤2;否则报告出错,申请的资源已经大于它需要的最大值。 2)如果requestij<=availablej,转向步骤3;否则报告出错,尚无足够的资源。 3)系统试探着把资源分配给pi,并修改下列数据结构中的值: availablej=availablej-requestj allocationij=allocationij+requestj  needij=needij-re

4、questj 4)系统进行安全性算法,检查此次分配后,系统是否还处于安全状态,若安全,把资源分配给进程pi;否则,恢复原来的资源分配状态,让进程pi等待。4. 安全性算法: int workRESOURCE_NUMBER; bool finishPROCESS_NUMBER; 1) Work=Available; Finish=false; 2) 寻找满足条件的i: A、Finishi=false; B、NeediWork; 如果不存在,则转4) 3) Work:=Work+Allocationi; Finishi:=true;转2) 4) 若对所有i,Finishi=true,则系统处于安全

5、状态,否则处于不安全状态   四、 数据结构: 数组五、 程序代码:#include<stdio.h>#include<iostream>#include<stdlib.h>#include<time.h>using namespace std;#define N 3 /进程数#define M 3 /资源数int AvailableM; /可用的资源数int NeedNM=0; /还需要的资源数int MaxNM; /最大需求量int AllocationNM = 0; /当前分配到的资源数int RequestNM=0; /请求的资

6、源数int n;time_t t;int isFinishN =0; /判断进程是否已经请求资源结束int test1 = 0;void Requester(); /进程随机请求资源数目void Handle(); /处理该请求bool Check(); /安全性算法检查void show(); /打印出当前的进程资源状态int Finish(int); /进程是否已经完成,若完成返回1,否则为0void main()int i;int j;cout << "请输入各个资源的可用数目:"for(i=0; i<M; i+)cin >> Avail

7、ablei; cout << "请依次输入各个进程对各个资源的最大需求数目:" << endl;for(i=0; i<N; i+)for(j=0; j<M; j+)cin >> Maxij;Needij = Maxij - Allocationij;cout << "-原始状态-" << endl;show();int test = 0;int testP = 0;int testR = 0;doRequester ();test+;while(test != 10);int Fin

8、ish(int i)int test = 0;int w = i; for(int j=0; j<M; j+)if(Needwj = 0) /对j资源的需求量已经为0test+;if(test = M) /如果对每个资源的需求量都已经为0isFinishw = 1; /则将其设为1,代表已经完成return isFinishw;void Requester ()time_t t;int test = 0;srand(unsigned)time(&t)+rand();n = rand()%N;for(int j=0; j<M; j+) if(Neednj <= Avai

9、lablej)test+;for(j=0; j<M; j+)if(test=N ) Requestnj = Neednj;elsesrand(unsigned)time(&t)+rand(); Requestnj = rand()%4;Handle();void Handle() /处理请求int test1 = 0;int test2 = 0;for(int j=0; j<M; j+)if(Requestnj<=Neednj)if(Requestnj <= Availablej)test1+;else cout<< "目前没有足够的资源分

10、配给你的进程" << n << "的请求"for(j=0; j<M; j+) cout << Requestnj << " "cout << ",请等待!" << endl <<endl;elsecout << "你的进程" << n << "所请求的资源" for(j=0; j<M; j+) cout << Requestnj <<

11、; " "cout << "已经超过进程的需求数目!" <<endl <<endl;if(test1 = M) /请求资源数目均小于可用资源数目cout << "处理你的进程" << n << "的请求" for(j=0; j<M; j+) cout << Requestnj << " " cout << endl ;for(j=0; j<M; j+) Availablej =

12、 Availablej- Requestnj; Allocationnj = Allocationnj+Requestnj; Neednj = Neednj-Requestnj;if(Check()=true) /安全性算法检查是安全的,则打印出来show();if(Finish(n) = 1) /如果此次分配后该进程已经结束,那么久释放其占用的资源数目cout << "进程" << n << "已经结束,会释放资源" << endl;for(j=0; j<M; j+) Availablej = Av

13、ailablej + Allocationnj; Allocationnj = 0; Neednj = 0;show(); else cout << "你的进程" << n << "所请求的资源" for(j=0; j<M; j+) cout << Requestnj << " " cout << "系统不安全!本次资源申请不成功!"<<endl <<endl;for(j=0; j<M; j+) /如不安全则

14、收回此次分配的资源数目 Availablej = Availablej + Requestnj; Allocationnj = Allocationnj - Requestnj; Neednj = Neednj + Requestnj;bool Check() /安全性算法检测int workM =0;bool finishN;for(int j=0; j<M; j+) workj = Availablej;for(int i=0; i<N; i+)finishi = false;int test = 0;bool flag;int k=0;for(j=0; j<M; j+)

15、if(Neednj <= workj)test+;if(test = M)flag = true;elseflag = false;test = 0;for(i=0;i<N;i+) for(i=0;i<N;i+) /循环检测 if(finishi = false && flag = true) for(j=0; j<M; j+) workj = workj + Allocationnj; finishi = true; test+;if(test = N)return true;elsereturn false;void show()cout <&

16、lt; "-" << endl;cout << "资源请求" << "t" << "已分配资源" << "t" << "尚需资源"<<"t" << "剩余可用资源" <<endl;cout << "进程名称" << "tA B C " << "t

17、A B C "<< "t A B C "<<endl;for(int i=0; i<N; i+)cout << " P" << i << " t"for(int j=0; j<M; j+)cout << Allocationij << " "cout << "t"for(j=0; j<M; j+)cout << Needij << " &q

18、uot;if( i=0 )cout << "t "for(j=0; j<M; j+)cout << Availablej << " "cout << endl;cout << "-" << endl <<endl;六、 运行结果: 七、 实验心得:这次的实验模拟实现银行家算法虽然用程序算法实现了模拟进程请求资源以及根据安全性检测是否要分配资源的整个过程,自己考虑整个代码的框架过程中期初觉得思路清晰,应该比较简单,但是列出框架以及主要函数之后开始用代码实现的时候,发现了很多隐藏的细节的考虑,比较繁琐而且环环相扣,要真的实现并没有当初以为的那么简单,比如我现在目前的算法虽然模拟了大

温馨提示

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

评论

0/150

提交评论