多资源银行家算法

  • 格式:doc
  • 大小:244.50 KB
  • 文档页数:28

多资源银行家算法多资源银行家算法1.设计思想当进程申请系统多种资源时,并且每种资源可以申请多个时,为了避免死锁,采用多资源的银行家算法。

本程序设计思想是采用试分配机制,当有请求提出时,先判读请求是否合理,再试将资源分给它,然后检查系统是否安全,若安全则将试分配作为实际分配;若安全则作废试分配,恢复原来的系统状态。

若安全则将试分配作为实际分配。

2.数据结构的说明int M; //资源种类int P; //进程数目int flag;struct process{ //虚拟PCBchar name[10]; //进程名int *H; //已分配资源int *N; //尚需资源int *R; //申请资源int finish;};H,R,N经过系统初始化后各自指向一个长度为M的int[M] 数组,数组的每一位代表一种资源process *PRO=new process[P];。

进程由通过动态申请后由指针向的数组实现。

3各模块的算法流程图初始化系统资源种类,进程个数以及各进程使用,即申请资源情况PROCE[number].R[i]<=PROCE[number].N[i])出错PROCE[n将资源分配给PROCE[number]试分配作PROCE[numb是否试分配source[i]=source[i ]-PROCE[number].R[NYN YNY4 程序清单#include "iostream"一次查找所PROCESS[I]已分配资源+source[]=标记PROCESS[I]为进程PROCESS[I]是否标记完陈PROCESS[I]尚需资源NYusing namespace std;int M; //资源种类int P; //进程数目int flag;struct process{ //虚拟PCBchar name[10]; //进程名int *H; //已分配资源int *N; //尚需资源int *R; //申请资源int finish;};void PRIN(process *PROCE,int *source,int M,int P){//y为第几次输出cout<<"*************************** ****************************"<<en dl;cout<<"进程名以分配设备尚需设备当前可用设备"<<endl;cout<<"设备编号";for(int q=0;q<3;q++){for(int I=0;I<M;I++)cout<<I<<" ";cout<<" ";}cout<<endl;cout<<"-------------------------------------------------------"<<endl;int i;int pp=0;flag=0;for(int e=0;e<P;e++){if(PROCE[e].finish==0){pp=1;//有进程得到满足,有输出cout<<" ";cout<<PROCE[e].name;cout<<" ";for(i=0;i<M;i++)cout<<PROCE[e].H[i] <<" "; cout<<" ";for(i=0;i<M;i++)cout<<PROCE[e].N[i] <<" "; cout<<" ";if(flag==1)cout<<endl;if(flag==0){for(i=0;i<M;i++)cout<<sour ce[i]<<" ";flag=1;cout<<endl; }}}if(pp==0){cout<<"";for(i=0;i<M;i++)cout<<source[i]<<" ";cout<<endl;}cout<<"*************************** ****************************"<<en dl;}int ISSAFE(process *PROCE,int *source,int M,int P,int *no){//试分配int i=0,j=0,k=0;for(int h=0;h<P;h++){for(j=0;j<P;j++){if(PROCE[j].finish==0){ //进程PROCE[i]尚未完成for(k=0;k<M;k++){if(PROCE[j].N[k]>source[k]){break;}}if(k==M){for(int h=0;h<M;h++){source[h]+=PROCE[j].H[h];}PROCE[j].finish=1;no[i]=j;//进程完成序列PRIN(PROCE,source, M, P);cout<<"请按任意键继续:"i++;getchar();}}}if(i==P){return 1;}//安全}return 0;//不安全}int TEST(process *PRO,int *SOURCE,int M,int P){int number=0;int *no;no=new int[P];//安全序列for(int k=0;k<P;k++)no[k]=0;int i=0,j=0;process *PROCE=new process[P];int *source;source=new int[M];for(i=0;i<M;i++)source[i]=SOURCE[i];for(i=0;i<P;i++){PROCE[i].H=new int[M];PROCE[i].N=new int[M];PROCE[i].R=new int[M];PROCE[i].finish=0;for(j=0;j<M;j++){PROCE[i].H[j]=PRO[i].H[j];PROCE[i].N[j]=PRO[i].N[j];PROCE[i].R[j]=PRO[i].R[j];}}for(i=0;i<P;i++){for(j=0;j<10;j++){PROCE[i].name[j]=PRO[i].name[j]; }}PRIN(PROCE,source, M, P); getchar();do{cout<<"请输入请求资源的进程编号:";cin>>number;if(number>=P||number<0)cout<<"输入进程编号非法!"<<endl;}while(number>=M||number<0);cout<<"请输入进程"<<number<<"请求的各资源数目:"<<endl;//输入请求序列cout<<"资源号为:";for(j=0;j<M;j++)cout<<j<<" ";cout<<endl;cout<<" ";for(j=0;j<M;j++)cin>>PROCE[number].R[j];//************************银行家算法**************************for(i=0;i<M;i++){if(PROCE[number].R[i]>PROCE[num ber].N[i]){cout<<"出错!R"<<i<<"大于"<<"P"<<i<<"尚需资源"<<endl;return 0;}}for(i=0;i<M;i++){if(PROCE[number].R[i]>source[i]){cout<<"出错!R"<<i<<"大于"<<"系统可用资源"<<endl;}}for(i=0;i<M;i++){source[i]=source[i]-PROCE[number].R[ i];PROCE[number].H[i]=PROCE[numbe r].H[i]+PROCE[number].R[i];PROCE[number].N[i]=PROCE[numbe r].N[i]-PROCE[number].R[i];}PRIN(PROCE,source, M, P); getchar();int FLAG=0;FLAG=ISSAFE(PROCE,source, M, P,no); //试分配判断是否安全if(FLAG==1){cout<<"安全序列:"<<endl;for(i=0;i<P;i++)cout<<no[i]<<" ";cout<<endl;}if(FLAG=0){cout<<"警告:当前状态不安全!不存在安全序列!"<<endl;}free(source);free(PROCE);void main(){//系统初始化//******************************* ************************cout<<"请输入进程数:";cin>>P;cout<<"请输入系统总的资源种类数:";cin>>M;process *PRO=new process[P];int i=0,j=0;for(i=0;i<P;i++){PRO[i].H=new int[M];PRO[i].N=new int[M];PRO[i].R=new int[M];PRO[i].finish=0;for(j=0;j<M;j++){PRO[i].H[j]=0;PRO[i].N[j]=0;PRO[i].R[j]=0;}}//********************************* **********************//输入系统初态//********************************* **********************cout<<"输入系统初态"<<endl;for(i=0;i<P;i++){cout<<"请输入进程"<<i<<"名称:";cin>>PRO[i].name;cout<<"请输入进程"<<i<<"已获得的各资源数目"<<endl;cout<<"资源号:";for(j=0;j<M;j++)cout<<j<<" ";cout<<endl;cout<<" ";for(j=0;j<M;j++)cin>>PRO[i].H[j];cout<<"请输入进程"<<i<<"尚需分配的各资源数目"<<endl;for(j=0;j<M;j++)cout<<j<<" ";cout<<endl;cout<<" ";for(j=0;j<M;j++)cin>>PRO[i].N[j];}int *SOURCE=new int[M];//当前系统可用资源cout<<"请输入系统当前可用的各资源数目:"<<endl;cout<<"资源号:";for(j=0;j<M;j++)cout<<j<<" ";cout<<endl;for(j=0;j<M;j++)cin>>SOURCE[j];//********************************* **********************while(1){TEST(PRO,SOURCE,M,P);}}5、使用说明由于没有对输入进行精确的异常处理,所以作者在输入界面提供了详细的输入引导信息,请按提示要求输入数字或字母。