银行家算法_实验报告_银行家算法实验报告
银行家算法_实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“银行家算法实验报告”。
课程设计报告
课程设计名称 共享资源分配与银行家算法
系(部)
专业班级
姓
名
学
号
指导教师
年 月 日
、目
录
一、课程设计目的和意义...................................................................................3
二、方案设计及开发过程..............................................................................................3
1.课题设计背景.................................................................................................................3 2.算法描述
............................................................................................................................3 3.数据结构
............................................................................................................................4 4.主要函数说明.................................................................................................................4 5.算法流程图......................................................................................................................5
三、调试记录与分析
四、运行结果及说明
..............................................................................................6
1.执行结果.........................................................................................................................6 2.结果分析.........................................................................................................................7
五、课程设计总结...................................................................................................8
、一、程设计目的和意义
计算机科学与技术专业学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,其目的在于加深催操作系统基础理论和基本知识的理解,加强学生的动手能力.银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法
二、方案设计及开发过程
1.课题设计背景
银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待
2.算法描述
1)如果Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: 如果Requesti[j]
2)如果Requesti[j]
3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]:=Available[j]-Requesti[j];Allocation[i,j]:=Allocation[i,j]+Requesti[j];Need[i,j]:=Need[i,j]-Requesti[j];
、4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程pi等待。
3.数据结构
1.可利用资源向量AVAILABLE。这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。
2.最大需求矩阵MAX。这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。
3.分配矩阵ALLOCATION。这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
4.需求矩阵NEED。这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]
4.主要函数说明
主要的常量变量
#define W 10 //最大进程数W=10 #define R 20 //最大资源总数R=20 int AVAILABLE[R];//可利用资源向量 int MAX[W][R];//最大需求矩阵 int ALLOCATION[W][R];//分配矩阵 int NEED[W][R];//需求矩阵 int Request[R];//进程请求向量
void changdata(int k);//进程请求资源数据改变 int chksec(int s);//系统安全性的检测
主要模块
void inputdata()void showdata()void changdata(int k)void restoredata(int k)int chksec(int s)int chkmax(int s)
、5.算法流程图
三、调试记录与分析
调试通过,程序未出错
、四、运行结果及说明
1.执行结果
、2.结果分析
银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁,若发生死锁则让进程等待。
、五、课程设计总结
通过本次银行家算法实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁。实验中遇到点问题,通过查阅资料、询问老师顺利解决。通过这次的实践,使我的理论知识更加的牢固。
附录
程序源码:
#include using namespace std;#define FALSE 0 #define TRUE 1 #define W 10 //最大进程数W=10 #define R 20 //最大资源总数R=20 int M;int N;int ALL_RESOURCE[W];int AVAILABLE[R];//可利用资源向量 int MAX[W][R];//最大需求矩阵 int ALLOCATION[W][R];//分配矩阵 int NEED[W][R];//需求矩阵 int Request[R];//进程请求向量 void inputdata();//数据输入 void showdata();//数据显示
void changdata(int k);//进程请求资源数据改变 void restoredata(int k);//数据恢复 int chksec(int s);//系统安全性的检测 int chkmax(int s);//检测最大需求
void bank();//检测分配的资源是否合理
int main(){ int i,j;inputdata();//安全性算法 for(i=0;i=M)
、cout
{
int i=0,j=0,p;cout>M;if(M>W)coutW);cout>N;if(N>R)coutR);cout>ALL_RESOURCE[i];cout>MAX[i][j];if(MAX[i][j]>ALL_RESOURCE[j])coutALL_RESOURCE[j]);} } cout
、for(j=0;j
do{ cin>>ALLOCATION[i][j];
if(ALLOCATION[i][j]>MAX[i][j])
cout
}while(ALLOCATION[i][j]>MAX[i][j]);} } cout
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for(j=0;j
AVAILABLE[j]=0;} } }
void showdata()//银行家算法
{ int i,j;cout
cout
、cout
cout
void changdata(int k)//进程请求资源数据改变
{ int j;for(j=0;j
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];} }
void restoredata(int k)//数据恢复
{ int j;for(j=0;j
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];} }
int chksec(int s)//系统安全性的检测
{ int WORK,FINISH[W];int i,j,k=0;for(i=0;i
FINISH[i]=FALSE;for(j=0;j
WORK=AVAILABLE[j];
、i=s;do
{ if(FINISH[i]==FALSE&&NEED[i][j]
{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
i=0;
}else
{ i++;
}
}while(i
if(FINISH[i]==FALSE)
{ return 1;
} } return 0;}
int chkmax(int s)//检测最大需求
{ int j,flag=0;for(j=0;j
if(MAX[s][j]==ALLOCATION[s][j])
{ flag=1;
AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];
MAX[s][j]=0;
} } return flag;} void bank(){ int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){ i=-1;while(i=M){ cout
cin>>i;if(i=M)
、cout
cin>>Request[j];if(Request[j]>NEED[i][j])
{ cout
cout
flag='N';
break;
}
else
{ if(Request[j]>AVAILABLE[j])
{ cout
cout
flag='N';
break;
}
} } if(flag=='Y'||flag=='y'){ changdata(i);
if(chksec(i))
{ cout
cout
cout
restoredata(i);
}
else
{ cout
cout
cout
showdata();
if(chkmax(i))
{cout
cout
showdata();
、}
} } cout>flag;}}