您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > 有三类资源的银行家算法
//本程序中假设系统中有有A,B,C三种资源#includestdio.h#includemalloc.h#includestdlib.h#includestring.h//N表示系统当前有几类资源#defineN3#defineA10#defineB5#defineC7charsafe_sequence[20][10]={'\0'};//定义数据结构typedefstructnode{charname[10];//进程名charstate;//进程状态R_ready;K-RUN;B--BLOCK;C--COMPLETEintapply[N];//当前申请量intwhole_need[N];//总共需求量intalloc[N];//已占资源量intflage;//是否能执行完0否structnode*next;}PCB;intsystem_available[N]={A,B,C};intsystem_allocation[N]={0,0,0};//三类资源已经分配出去的个数//创建进程//建立带头结点的链表,链表共有n个结点,且各结点未赋值intgetready_process(PCB*p,intn){PCB*set,*w;w=p;for(;n0;n--){set=(PCB*)malloc(sizeof(PCB));if(!set)return0;set-next=w-next;w-next=set;set-state='R';set-flage=0;w=set;}return1;}//银行家算法q是系统中进程链表的第一个结点的指针,avaliale是system——available的复制,(allocation类似),curr指向当前请求分配资源的进程结点//为了表示其他进程在的到资源后成功运行完成,这里不真正减去分配给它的资源,而是把进程状态置为运行完成状态Cintbank(PCB*q,intavailable[N],PCB*curr,intallocation[N],intn){inti=0;PCB*p;intj;intk=0;//判断是否申请的资源都刚好使得进程完成intm;intr;//请求超过进程所需最大资源p=q;for(j=0;jN;j++){if(curr-apply[j](curr-whole_need[j]-curr-alloc[j]))break;}if(jN){printf(进程请求超过了进程所需要的最大资源,出错!);exit(0);//errorgetchar();}for(j=0;jN;j++){if(curr-apply[j]available[j])continue;else{k++;}}if(k==N){curr-flage=1;curr-state='C';for(m=0;mN;m++){curr-alloc[m]+=curr-apply[m];available[m]+=curr-alloc[m];allocation[m]-=curr-alloc[m];}}else{curr-state='K';for(m=0;mN;m++){available[m]-=curr-apply[m];allocation[m]+=curr-apply[m];curr-alloc[m]+=curr-apply[m];}}//假设把资源分配给了申请资源的进程后,现在从进程中找安全序列while(p){//即改进程没有执行完if(p-flage!=1){for(m=0;mN;m++){if((p-whole_need[m]-p-alloc[m])available[m]||(p-whole_need[m]-p-alloc[m])==available[m]){continue;}elsebreak;}if(m==N||mN){p-flage=1;strcat(safe_sequence[i],p-name);i++;for(r=0;rN;r++)available[r]=available[r]+p-alloc[r];p=q;continue;}}p=p-next;}p=q;while(p){if(p-flage!=1)return0;elsep=p-next;}return1;}voidmain(){inti;intn;intzx;intwork[N];//是system_avaliable的复制intallo[N]={0};//是system_allocation的复制intm;charcurr_name[10];PCB*q,*p,*curr;//curr表示当前要申请资源的进程PCB*head;head=(structnode*)malloc(sizeof(PCB));//头结点head-next=NULL;q=head;printf(本系统由08级软件工程一班XXX制作,具体操作说明如下:\n\n);printf(***********************************************************\n);printf(1,本系统共有A,B,C3类资源,其中A类资源10个,B类资源5个,C类资源7个\n\n);printf(2,请用户在输入资源时注意,如果希望添加资源种类,\n);printf(可以在源程序中给N重新赋值!\n\n);printf(2,用户在输入资源时请严格按照资源ABC的顺序对每个进程输入,如果输入的,\n);printf(资源顺序颠倒本系统任然按照ABC的顺序读入数据!\n\n);printf(3,请按照程序提示输入,可以保证您得到预期的值!\n);printf(*************************************************************\n\n);printf(请输入您要创建的进程个数:);scanf(%d,&n);printf(\n);if(getready_process(q,n))printf(进程创建成功!);else{printf(进程创建失败!);exit(0);getchar();}q=head-next;printf(请按照下列提示输入进程信息:\n);printf(\n);printf(进程名(不超过十个字母)\t共需要%d资源量分别为\t已占%d类资源量分别为\n,N,N);for(i=0;in;i++){scanf(%s,&(q-name));for(m=0;mN;m++)scanf(%d,&(q-whole_need[m]));for(m=0;mN;m++)scanf(%d,&(q-alloc[m]));getchar();q=q-next;}p=head-next;//计算系统中已经分配出去的各类资源数while(p){for(m=0;mN;m++){system_allocation[m]+=p-alloc[m];}p=p-next;}//计算系统还剩的资源for(m=0;mN;m++){system_available[m]-=system_allocation[m];}//选择就绪进程进行银行家算法//通过判断标志位来看此进程有没有阻塞//传过去的参数应该有进程头指针,以及一些存放资源的数组的复制,如果return1,就对真正的数组执行加减操作//参数:进程头指针,资源数,for(m=0;mN;m++){work[m]=system_available[m];allo[m]=system_allocation[m];}p=head-next;//curr表示当前申请资源的进程printf(请输入当前要申请资源的进程名称:\t);scanf(%s,&(curr_name));curr=p;while(curr){if(!(strcmp(curr-name,curr_name))){break;}curr=curr-next;}if(!curr){printf(系统中当前没有此进程,请确认您输入的进程名是否有错!);exit(0);getchar();}printf(进程当前申请的资源数分别是:);for(m=0;mN;m++){scanf(%d,&curr-apply[m]);}if(bank(p,work,curr,allo,n)){//返回了可以,则把进程当前的申请量置0//进程完成if(curr-state=='C'){}else{curr-state='R';}for(m=0;mN;m++){system_available[m]-=curr-apply[m];system_allocation[m]+=curr-apply[m];}printf(系统给该进程分配资源后仍然处于安全状态,所以分配成功!\n);printf(查找的安全序列是:\n);for(zx=0;zxn;zx++){printf(%s\t,safe_sequence[zx]);}//在这添加一个输出进程资源状况的函数}else{//恢复分配给进程的资源for(m=0;mN;m++){curr-alloc[m]-=curr-apply[m];}curr-state='B';//分配不成功,则阻塞printf(系统给该进程分配资源后处于不安全状态,所以该进程的资源请求不能得到满足);}}
本文标题:有三类资源的银行家算法
链接地址:https://www.777doc.com/doc-243606 .html