《银行家算法的模拟实现》 --实验报告题目: 银行家算法的模拟实现专业:班级:组员:指导老师:一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。
二、实验内容模拟实现银行家算法实现死锁避免。
要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。
三、实验分析过程1、整个银行家算法的思路。
先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。
1)进程一开始向系统提出最大需求量.?2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.?3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的?剩余资源量,若不超出,则分配,否则等待2、算法用到的主要数据结构和C语言说明。
(1)、可利用资源向量 INT AVAILABLE[M] M为资源的类型。
(2)、最大需求矩阵 INT MAX[N][M] N为进程的数量。
(3)、已分配矩阵 INT ALLOCATION[N][M](4)、还需求矩阵 INT NEED[N][N](5)、申请各类资源数量int Request[x]; ."<<endl;cout<<"|-------|------------|-----------|----------|-----------|"<<endl;cout<<"|-------|最大需求矩阵|已分配矩阵-|-需求矩阵-|可利用资源-|"<<endl;cout<<"| 资源 | Max | Allocation| Need | available |"<<endl;cout<<"| | A B C | A B C | A B C | A B C |"<<endl;cout<<"|进程 | | | | |"<<endl;cout<<"|-------|------------|-----------|----------|-----------|"<<endl;for(i=0;i<5;i++){cout<<"| p"<<i<<" | ";for(j=0;j<3;j++) {cout<<max[i][j]<<" "; }cout<<" | ";for(j=0;j<3;j++) {cout<<" "<<allocation[i][j]; }cout<<" | ";for(j=0;j<3;j++) {cout<<" "<<need[i][j]; }cout<<" |";if(i==0) {for(j=0;j<3;j++) {cout<<" "<<available[j]; }cout<<" |"; }if(i>0){cout<<" |"; }cout<<endl; }cout<<"|-------|------------|-----------|----------|-----------|"<<endl; }/*--------试分配函数-------*/void tryfenpei(int i){for(int f=0;f<c;f++){available[f]=available[f]-request[f];allocation[i][f]=allocation[i][f]+request[f];need[i][f]=need[i][f]-request[f];}}/*--------恢复数据函数-------*/void refenpei(int i){for(int f=0;f<c;f++){available[f]=available[f]+request[f];allocation[i][f]=allocation[i][f]-request[f];need[i][f]=need[i][f]+request[f];}}int com(int *p,int *q){int i;for(i=0;i<c;i++)if(p[i]>q[i])return 0;return 1;}/*--------安全检测函数---------*/void checksafe(int s)int flag,temp[t],i,j,l,k=0;bool finish[t];for(i=0;i<t;i++)finish[i]=false;for(j=0;j<c;j++)work[j]=available[j];cout<<"|-------|-----------------|----------|"<<endl;cout<<"| resource |-Work+Allocation-|--Finish--|"<<endl;cout<<"| | A B C | T/F |"<<endl;cout<<"|programme | | |"<<endl;cout<<"|-------|-----------------|----------|"<<endl;for(i=0;i<t;i++){l=0;for(j=0;j<c;j++){if(need[i][j]>work[j])l=1;break;}if(finish[i]==false&&l==0){cout<<"| p"<<i<<" | ";for(j=0;j<c;j++){work[j]=work[j]+allocation[i][j];if(work[j]>9)cout<<" "<<work[j]<<" ";elsecout<<" "<<work[j]<<" ";}cout<<" ";cout<<"|";cout<<" ";finish[i]=true;cout<<"true ";cout<<"|";temp[k]=i;."<<endl;refenpei(in);cout<<"恢复数据成功!正在打印输出..."<<endl;print();}elsecout<<"找到一个安全系列:";for(i=0;i<t;i++)cout<<"P"<<temp[i]<<"--->";cout<<endl<<"已通过安全性测试!"<<endl<<endl<<endl;cout<<"开始给第"<<"p]"<<in<<"]"<<"进程分配资源..."<<endl;cout<<"分配完成!打印输出..."<<endl<<endl;print();cout<<endl;}}}五、程序运行结果及分析1、运行结果输入初值,进行安全性测试,结果安全序列,依次为P4-P0-P1-P2-P3分配资源:资源不足,无法继续实验:2、出现问题及解决方案本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。
在长期的设计调试过程中遇到过许多问题,通过网上搜索、查询资料、调试试验等方法一一解决。
下面大致罗列一些主要问题:(1)、关于某些判断算法优劣问题:在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时有很多方法,而有的算法可以更节省时间。
如下安全性算法中寻找寻找符合Finish[i]==0条件的进程的例子:/* 算法一:for (j=0; j<m; j++)if (Work[j]>=Need[i][j]) counter=counter+1;//记数if(counter==m){…*/ //算法二:for (j=0; j<m; j++)if (Work[j]>=Need[i][j]); //可用大于等于需求else{counter=1;break;}if(counter!=1){…显然算法二要优于算法一。
本程序中还有很多类似的地方。
这里主要考虑的是一个程序的优化设计问题。
(2)、关于某些系统函数调用时的执行顺序:在调用一些系统函数如getch() 、system("pause")等时发现其执行顺序的一些问题。
如类似:cout<<" =================================="<<endl;cout<<" \n\n\n"<<endl;system("pause");//暂停调试时发现此时:在Microsoft Visual C++ 中先执行system("pause") 再输出显示,而在调试器Bloodshed Dev-C++中则顺序执行;但当把cout<<" \n\n\n"<<endl;改为 cout<<endl<<endl<<endl; 其他不变时,则在两中调试器中均为顺序执行,即先显示后暂停。