银行家算法

  • 格式:doc
  • 大小:174.50 KB
  • 文档页数:11

银行家算法上机实验报告1、实验目的模拟银行家算法,加深了解有关资源申请、死锁避免、状态安全性等概念,并体会和运用避免死锁的具体方法。

然后自行设计模拟程序。

2、实验内容用C语言或C++语言对银行家算法进行模拟。

要求以文件形式输入以下数组:Available: array[1..m]of integer; //系统可用资源Max: array[1..n,1..m]of integer; //进程最大需求Allocation: array[1..n,1..m]of integer; //当前分配Need: array[1..n,1..m]of integer; //尚需资源输入文件内容及格式见附录A。

其中,资源种类数m=3,进程数n=5在程序中手工输入:Request i: array[1..m]of integer; //第i个进程的资源请求要求检测输出若满足该进程的请求则系统状态是否安全,若状态安全则输出安全进程序列。

3、实验笔记记录在完成该次实验作业的过程中,每次上机实验的时间和简要的实验过程,每次的实验过程应包括:该次上机完成的实验内容,编程思路,调试程序中遇到的问题,解决方法,遗留的问题等。

2011年11月7日星期一内容:深刻了解有关实验目的,仔细阅读有关实验内容,对银行家算法进行初步的构思,分析。

原理:银行家算法是一种最有代表性的避免死锁的算法。

在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。

2011年11月8号星期二内容:分析实现银行家算法所需资源,Available :系统可用资源、Max: 进程最大需求、Allocation:当前分配、Need: array尚需资源、Request i: 第i个进程的资源请求。

Available: array[1..3]of integer; //系统可用资源Max: array[1..5,1..3]of integer; //进程最大需求Allocation: array[1..5,1..3]of integer; //当前分配Need: array[1..5,1..3]of integer; //尚需资源Request i: array[1..3]of integer; //第i个进程的资源请求2011年11月14号星期一内容:选择利用c++完成银行家算法,对数据进行处理,从文件banker中读入Available :系统可用资源、Max: 进程最大需求、Allocation:当前分配、Need: array尚需资源等资源的数据。

问题:读取的数据不能显示解决:报banker中的英文单词删除2011年11月18日内容:继续完成银行家算法(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。

(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

2011年11月19日内容:安全性检查FINISH[M]=FALSE(2)从进程集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=AVAILABLE如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

AVAILABLE+=ALLOCATIONFINISH=TRUEGO TO 2(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

2011年11月20日内容;试图简化代码,但没有成功。

4、总结银行家算法是避免死锁的一种重要方法,在完成作业的过程中加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

银行家算法描述:操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。

若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

在完成作业的过程中也遇到了麻烦,从文件中读入数据应该删除多余的注释等,以免对读入的数造成影响。

自己做的银行家算法太过于麻烦的有无力改变,暂时没有想到什么好的解决办法。

附录A:输入文件内容及格式:Max7 5 33 2 29 0 22 2 24 3 3Allocation0 1 02 0 03 0 22 1 10 0 2Need7 4 31 2 26 0 00 1 14 3 1Available3 3 2输出内容(填写程序运行时屏幕上的输出结果):以进程2为例,请求资源1,1,1;源代码:#include<iostream>#include<fstream>using namespace std;int main(){int const m=3;int const n=5;bool A(int,int Need[5][3]);void B(int i,int Max[5][3],int Need[5][3],int Allocation[5][3],int Available[3]);int Max[5][3]; //进程最大需求int Allocation[5][3]; //当前分配int Need[5][3]; //尚需资源int Available[3];//系统可用资源int Request[3];bool t[n];int a,k;ifstream infile("banker.txt",ios::in);if(!infile){cerr<<"open error!"<<endl;exit(1);}cout<<"获取进程最大需求"<<endl; for(int i=0;i<5;i++){for(int j=0;j<3;j++){infile>>Max[i][j];cout<<Max[i][j]<<" ";}cout<<endl;}cout<<"获取当前分配"<<endl;for( i=0;i<5;i++){for(int j=0;j<3;j++){infile>>Allocation[i][j];cout<<Allocation[i][j]<<" ";}cout<<endl;}cout<<"获取尚需资源"<<endl;for( i=0;i<5;i++){for(int j=0;j<3;j++){infile>>Need[i][j];cout<<Need[i][j]<<" ";}cout<<endl;}cout<<"获取系统可用资源"<<endl; for(i=0;i<3;i++){infile>>Available[i];cout<<Available[i]<<" ";}infile.close();cout<<endl;for(k=0;k<5;k++){t[k]=false;}cout<<"请输入满足哪进程的请求:"; cin>>a;cout<<"进程"<<a<<endl;cout<<"请输入请求分配资源:";for(i=0;i<m;i++){cin>>Request[i];}for( i=0;i<m;i++){if(Request[i]>Available[i])cout<<"请求资源过大,超过可用资源量"<<endl;else if(Request[i]>Need[a-1][i])cout<<"需求超过进程课所需资源"<<endl;else{for(i=0;i<m;i++){Need[a-1][i]-=Request[i];Allocation[a-1][i]+=Request[i];Available[i]-=Request[i];}t[a-1]=A(a,Need);if(t[a-1])B(a,Max,Need,Allocation,Available);for(i=0;i<n;i++){if(Available[0] >= Need[i][0] && Available[1]>=Need[i][1] && Available[2]>=Need[i][2] && t[i]==false){for(int j=0;j<m;j++){Need[i][j]=0;Allocation[i][j]=Max[i][j];Available[j]+=Max[i][j];}cout<<"进程"<<i+1<<"安全"<<endl;t[i]=true;}if(t[i])B(i,Max,Need,Allocation,Available);}for(i=0;i<n;i++){if(Available[0] >= Need[i][0] && Available[1]>=Need[i][1] && Available[2]>=Need[i][2] && t[i]==false){for(int j=0;j<m;j++){Need[i][j]=0;Allocation[i][j]=Max[i][j];Available[j]+=Max[i][j];}cout<<"进程"<<i+1<<"安全"<<endl;t[i]=true;}if(t[i])B(i,Max,Need,Allocation,Available);}for(i=0;i<n;i++){if(Available[0] >= Need[i][0] && Available[1]>=Need[i][1] && Available[2]>=Need[i][2] && t[i]==false){for(int j=0;j<m;j++){Need[i][j]=0;Allocation[i][j]=Max[i][j];Available[j]+=Max[i][j];}cout<<"进程"<<i+1<<"安全"<<endl;t[i]=true;}if(t[i])B(i,Max,Need,Allocation,Available);}for(i=0;i<n;i++){if(Available[0] >= Need[i][0] && Available[1]>=Need[i][1] && Available[2]>=Need[i][2] && t[i]==false){for(int j=0;j<m;j++){Need[i][j]=0;Allocation[i][j]=Max[i][j];Available[j]+=Max[i][j];}cout<<"进程"<<i+1<<"安全"<<endl;t[i]=true;}if(t[i])B(i,Max,Need,Allocation,Available);}for(i=0;i<n;i++){if(Available[0] >= Need[i][0] && Available[1]>=Need[i][1] && Available[2]>=Need[i][2] && t[i]==false){for(int j=0;j<m;j++){Need[i][j]=0;Allocation[i][j]=Max[i][j];Available[j]+=Max[i][j];t[i]=true;}cout<<"进程"<<i+1<<"安全"<<endl;}if(t[i])B(i,Max,Need,Allocation,Available);}}}if(t[0] && t[1] && t[2] && t[3] && t[4])cout<<"算法安全"<<endl;else cout<<"算法不安全"<<endl;return 0;}bool A(int a,int Need[5][3]){if(Need[a-1][0]==0 &&Need[a-1][1]==0 &&Need[a-1][2]==0){cout<<"进程"<<a<<"安全"<<endl;return true;}else return false;}void B(int i,int Max[5][3],int Need[5][3],int Allocation[5][3],int Available[3]){int m=3;实验报告for(int j=0;j<m;j++){Available[j]+=Max[i-1][j];Need[i-1][j]=0;Allocation[i-1][j]=0;}}11。