洛阳理工学院实验报告学院计信学院班级学号姓名课程名称操作系统实验日期10.17实验名称实验二银行家算法成绩实验目的:1.了解进程产生死锁的原因,了解为什么要进行死锁的避免。2.掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。实验原理:n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源。系统按各进程的申请动态的分配资源,先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检测算法进行安全性检测,如果系统分配资源,系统进入安全状态,则预分配就是正式分配,如果系统分配资源,系统进入不安全状态,则撤销预分配。实验内容:#includestdio.h#includestdlib.h#defineTRUE1#defineFALSE0inti,j,k,l;intflag;charc;typedefstructBanker{int*Available;//可利用资源向量int**Max;//最大需求矩阵int**Allocation;//分配矩阵int**Need;//需求矩阵int**Requst;//申请各类资源数量int*Work;//工作向量int*Finish;//结束向量}Process;intBank(Process*process,intm,intn);intSafe(Process*process,intm,intn);voidMax(Process*process,intm,intn);voidNeed(Process*process,intm,intn);voidAllocation(Process*process,intm,intn);voidAvailable(Process*process,intn);intRequst(Process*process,intm,intn);intBank(Process*process,intm,intn){do//资源请求失败或者系统不安全时flag=0,并重新输入。{if((flag=Requst(process,m,n))==1){printf(请求并试分配成功。\n);for(j=0;jn;j++){(process-Available)[j]-=(process-Requst)[l][j];(process-Allocation)[l][j]+=(process-Requst)[l][j];(process-Need)[l][j]-=(process-Requst)[l][j];}}if(flag==1&&(flag=Safe(process,m,n))==0)//系统不安全,撤销资源试分配{printf(撤销资源试分配。\n);for(j=0;jn;j++){(process-Available)[j]+=(process-Requst)[l][j];(process-Allocation)[l][j]-=(process-Requst)[l][j];(process-Need)[l][j]+=(process-Requst)[l][j];}}}while(flag==0);if(flag==1){printf(分配成功。\n);printf(是否继续请求资源分配?输入Y继续,输入y结束:\n);getchar();c=getchar();if(c=='Y')return1;if(c=='y')return0;}}intSafe(Process*process,intm,intn){(process-Work)=(int*)malloc(sizeof(int)*n);for(j=0;jn;j++)(process-Work)[j]=(process-Available)[j];//系统可提供给进程继续运行所需的各类资源数目(process-Finish)=(int*)malloc(sizeof(int)*m);for(i=0;im;i++)(process-Finish)[i]=FALSE;k=m;intflag1;//当有不符合条件的资源时标记为0intflag2;//当所有进程不都分配成功时标记为0int*s=(int*)malloc(sizeof(int)*m);//记录安全序列do{for(i=0;im;i++)//一轮分配if((process-Finish)[i]==FALSE){flag1=1;for(j=0;jn;j++)if((process-Need)[i][j](process-Work)[j])flag1=0;//有不符合条件的资源if(flag1==1){for(j=0;jn;j++)*((process-Work)+j)+=*((process-Allocation)[i]+j);(process-Finish)[i]=TRUE;*s=i;s++;}}k--;//每完成一次进程分配时k减1,以便跳出循环和防止死循环}while(k0);flag2=1;for(i=0;im;i++)//判断是否所有进程都完成{if((process-Finish)[i]==FALSE){flag2=0;break;}}if(flag2==0){printf(当前状态不安全!\n);return0;}else{printf(当前状态安全!\n);for(i=0;im;i++)s--;printf(安全序列为:);for(i=0;im;i++)printf(P%d,s[i]);printf(\n);free(s);return1;}}voidMax(Process*process,intm,intn){process-Max=(int**)malloc(sizeof(int*)*m);//分配m个指针,用来指向数组的首地址for(i=0;im;i++)(process-Max)[i]=(int*)malloc(sizeof(int)*n);//为每个数组分配n个指针元素printf(输入各进程对各类资源的最大需求量:\n);for(i=0;im;i++){printf(P%d:\n,i);for(j=0;jn;j++){scanf(%d,((process-Max)[i]+j));}}}voidNeed(Process*process,intm,intn){process-Need=(int**)malloc(sizeof(int*)*m);for(i=0;im;i++)(process-Need)[i]=(int*)malloc(sizeof(int)*n);printf(输入各进程对各类资源的需求量:\n);for(i=0;im;i++){printf(P%d:\n,i);for(j=0;jn;j++){scanf(%d,((process-Need)[i]+j));}}}voidAllocation(Process*process,intm,intn){process-Allocation=(int**)malloc(sizeof(int*)*m);for(i=0;im;i++)(process-Allocation)[i]=(int*)malloc(sizeof(int)*n);for(i=0;im;i++)for(j=0;jn;j++)*((process-Allocation)[i]+j)=(*((process-Max)[i]+j))-(*((process-Need)[i]+j));}voidAvailable(Process*process,intn){process-Available=(int*)malloc(sizeof(int)*n);printf(输入系统可用资源数:\n);for(i=0;in;i++)scanf(%d,&(process-Available)[i]);}intRequst(Process*process,intm,intn){process-Requst=(int**)malloc(sizeof(int*)*m);for(i=0;im;i++)(process-Requst)[i]=(int*)malloc(sizeof(int)*n);printf(输入进程名及其资源请求量:\n);scanf(%d,&i);l=i;for(j=0;jn;j++)scanf(%d,(process-Requst)[i]+j);intflag1=1;//申请量大于需求量时标记为0intflag2=1;//申请量大于可利用资源量时标记为0for(j=0;jn;j++)//检查申请量是否小于等于需求量if((process-Requst)[i][j](process-Need)[i][j])flag1=0;if(flag1==0){printf(不允许申请量大于需求量!请重新输入。\n);return0;}if(flag1==1){for(j=0;jn;j++)//检查申请量是否小于等于系统中的可利用资源量if((process-Requst)[i][j](process-Available)[j])flag2=0;if(flag2==0){printf(不允许申请量大于可利用资源量!请重新输入。\n);return0;}elsereturn1;}}intmain(){Processprocess;intm,n;printf(请输入进程数:);scanf(%d,&m);printf(请输入资源种类数:);scanf(%d,&n);Max(&process,m,n);Need(&process,m,n);Allocation(&process,m,n);Available(&process,n);Safe(&process,m,n);while(Bank(&process,m,n));return0;}实验结果:实验总结(结论或问题分析):本次实验中实际输出数据与预期的输出相同。在解决银行家算法问题的过程当中,发现了自己在程序和数据结构等多方面不足,在本次实践过程中,加深了对银行家算法的理解,同时也加深了对程序和数据结构等知识的应用。