操作系统实验_银行家算法_第1页
操作系统实验_银行家算法_第2页
操作系统实验_银行家算法_第3页
操作系统实验_银行家算法_第4页
操作系统实验_银行家算法_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、学号P71514032 专业计算机科学与技术 姓名 实验日期2017.11.9 教师签字 成绩实验报告【实验名称】银行家算法【实验目的】掌握银行家算法,用银行家算法模拟操作系统避免死锁的方法【实验原理】银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系

2、统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况【数据结构和符号说明】可利用资源向量Available最大需求矩阵Max分配矩阵Allocation需求矩阵Need工作向量Work标记向量Finishchar name10010;/定义

3、最大100个进程,每个大小为10int Max100100; /定义int Allocation100100;/可利用资源向量资源数int Need100100; /需求矩阵int avaiable100; /系统可利用资源int avaiable1100;int state100; /进程状态数组char name110010;/进程名int bigger; ;/是否大于int N; /进程数int n; /资源数int counter;函数:void Input()/输入函数void Init()/初始化void output()/输出安全序列或等待void insert_pcb()/请求

4、进程或更新进程void show()/显示界面与选择int CmpRequestAvailable(int Pos,int n)/比较Request和Available的大小int CmpRequestNeed(int Pos,int n)/比较Request和Need的大小void Reset(int n,int Pos)/更新request之后的Need,Allocation,Available的值void Banker()/银行家算法【实验流程图及算法实现】用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统

5、按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况【流程图】代码:#include<iostream>using namespace std;char name10010;定义最大100个进程,每个大小为10int Max100100; /定义int Allocation100100;/可利用资源向量资源数int Need100100; /需求矩阵int avaiable100; /int state100; /进程状态数组int dayu; ;是否大于int

6、N;int n;void input () cout<<"输入进程个数"<<endl; cin>>N; cout<<"输入资源个数"<<endl; cin>>n; cout<<"系统现有的各资源的个数"<<endl; for(int i=0; i<n; i+) cin>>avaiablei; for(int i=0; i<N; i+)/输入 cout<<"输入第"<<i&l

7、t;<"个进程的名字"<<endl; cin>>namei; cout<<"输入第"<<i<<"所需要各进程的最大资源数"<<endl; for(int j=0; j<n; j+) cin>>Maxij; cout<<"输入第"<<i<<"现在所拥有的资源个数"<<endl; for(int j=0; j<n; j+) cin>>All

8、ocationij; statei=0; for(int i=0; i<N; i+)for(int j=0; j<n; j+) /寻找需求矩阵 Needij=Maxij-Allocationij;void yinhangjia() int i,j,k; for( i=0; i<N; i+) for( j=0; j<N; j+) if(statej=1) continue; dayu=0; for( k=0; k<n; k+) if(avaiablek>=Needjk) dayu=1; else dayu=0; break; if(dayu=1)/判断状态 s

9、tatej=1; cout<<namej<<endl; for(int m=0; m<n; m+) avaiablem+=Allocationjm; break; int main()input();/输入yinhangjia();截图:带有resquest请求更新的银行家算法:描述:1)如果Requesti 是进程Pi的请求向量,如果Requesti,j=K,表示进程Pi需要K个Rj类型的资源。当发出资源请求后,系统按下述步骤进行检查: 如果Requestij<= Needi,j,便转向步骤2;否则认为出错,因为它所需要的资源

10、数已超过它所宣布的最大值。 2)如果Requestij<=Availablej,便转向步骤3,否则,表示尚无足够资源,进程Pi须等待。3)系统试探着把资源分配给进程,并修改下面数据结构中的数值。4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进i,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程等待。流程图:代码:#include<iostream>#include<string.h>using namespace std;char name10010;/定义最大100个进程,每个大小

11、为10int Max100100; /定义int Allocation100100;/可利用资源向量资源数int Need100100; /需求矩阵int avaiable100; /int avaiable1100;int state100; /进程状态数组char name110010;int bigger; ;/是否大于int N;int n;int counter;void input ()/输入函数 cout<<"输入进程个数"<<endl; cin>>N; cout<<"输入资源个数"<&

12、lt;endl; cin>>n; cout<<"系统现有的各资源的个数"<<endl; for(int i=0; i<n; i+) cin>>avaiablei; avaiable1i=avaiablei; for(int i=0; i<N; i+)/输入 cout<<"输入第"<<i+1<<"个进程的名字"<<endl; cin>>namei; cout<<"输入第"<<

13、i+1<<"所需要各进程的最大资源数"<<endl; for(int j=0; j<n; j+) cin>>Maxij; cout<<"输入第"<<i+1<<"现在所拥有的资源个数"<<endl; for(int j=0; j<n; j+) cin>>Allocationij; statei=0; for(int i=0; i<N; i+) for(int j=0; j<n; j+) /寻找需求矩阵 Needij=M

14、axij-Allocationij;void Banker()/银行家算法 int i,j,k; counter=0; for(i=0; i<N; i+) statei=0; for( i=0; i<N; i+)/循环次数 for( j=0; j<N; j+)/每次从头越查找 if(statej=1) continue; bigger=0; for( k=0; k<n; k+) if(avaiablek>=Needjk)/每一个大于需求 bigger =1; else bigger=0; break;/跳出需求循环 if( bigger=1)/判断状态,此时该进程

15、所有need<= avaiable statej=1; strcpy(name1counter+,namej); for(k=0; k<n; k+) avaiablek+=Allocationjk;/更新avaiable向量 break; void output()/输出安全序列或等待 int i; if (counter=N) cout<<"安全序列为:" for(i=0; i<N-1; i+) cout<< name1i<<"-> " cout<< namei<<en

16、dl<<endl; else cout<<"不存在安全序列,插入失败"<<endl;void insert_pcb()/请求进程或更新进程 char name110; int choose; int add100; cout<<"1、增加新的进程"<<endl; cout<<"2、对原有进程增加资源申请"<<endl; cin>>choose; if(choose=1) int bigger=0; cout<<"输入插

17、入进程的名字"<<endl; cin>>nameN; cout<<"输入该进程拥有的资源个数"<<endl; for(int j=0; j<n; j+) cin>>AllocationNj; stateN=0; cout<<"输入该所需要各资源最大数目"<<endl; for(int j=0; j<n; j+) cin>>MaxNj; NeedNj=MaxNj-AllocationNj; stateN=0; for( int k=0; k

18、<n; k+) if(avaiablek>=NeedNk)/每一个大于需求 bigger =1; else bigger=0; break;/跳出需求循环 if(bigger=1) cout<<"插入成功"<<endl; N=N+1; Banker(); output(); else cout<<"插入失败,进程等待!"<<endl; else int pos;/找到需更新进程的位置 cout<<"输入原有进程的名字"<<endl; cin>&g

19、t;name110; for(int i=0; i<N; i+) if(!strcmp(name1,namei) pos=i; break; cout<<"输入该进程还需要的各资源数"<<endl; for(int j=0; j<n; j+) cin>>addj; for( int k=0; k<n; k+) if(avaiablek>=addk)/每一个大于需求 bigger =1; else bigger=0; break;/跳出需求循环 if(bigger=1) cout<<"插入成功&

20、quot;<<endl; for(int m=0; m<n; m+) Maxposm+=addm; Needposm+=addm; avaiablem=avaiable1m; Banker(); output(); else cout<<"插入失败,进程等待!"<<endl; void show()/显示界面与选择 int i,j; cout<<endl<<"*最大需求矩阵*"<<endl; cout<<"进程名t" for(i=0; i<

21、n; i+) cout<<"max"<<i<<""<<"t" cout<<endl; for(i=0; i<N; i+) cout<<namei<<"t" for(j=0; j<n; j+) cout<<Maxij<<"t" cout<<endl; cout<<"*"<<endl<<endl; cout<

22、<"*各进程已有资源数*"<<endl; cout<<"进程名t" for(i=0; i<n; i+) cout<<"Allocation"<<i<<""<<"t" cout<<endl; for(i=0; i<N; i+) cout<<namei<<"tt" for(j=0; j<n; j+) cout<<Allocationij&

23、lt;<"tt" cout<<endl; cout<<"*"<<endl<<endl; cout<<"*各进程需求资源数*"<<endl; cout<<"进程名t" for(i=0; i<n; i+) cout<<" Need"<<i<<""<<"t" cout<<endl; for(i=0; i<

24、;N; i+) cout<<namei<<"tt" for(j=0; j<n; j+) cout<< Needij<<"tt" cout<<endl; cout<<"*"<<endl<<endl;int main() int select; cout<<"银行家算法"<<endl; cout<<"初始化"<<endl; input();/输入 sh

25、ow(); Banker(); output(); do cout<<"1、更新"<<endl; cout<<"2、查看各进程的信息"<<endl; cout<<"3、结束"<<endl; cin>>select; if(select=3) break; else if(select=1) insert_pcb(); else show(); while(1);截图:输入资源种类数目,输入最大需求矩阵,输入分配矩阵,输入可用资源数目,得到安全序列对进程P1进行请求,此时会形成一个新的安全序列,p1进程的need和max发生相应的变化。继续修改进程4,插入各需求3 3 0,不存在安全序列,此时需要等待。请求一个新进程,所需求的最大资源为3 3 4,现有为2 2 3,形成新的安全序列。查看各进程信息,并输出安全序列。再请求一个新的大进程,此时资源不足,需要等待。资源数为4:更新P1进程,程序阻塞,进程等待。请求一个新进程,P5。插入成功,

温馨提示

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

评论

0/150

提交评论