死锁_银行家算法实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“银行家算法实验报告”。
实验目的银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法
二、实验要求
根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。
(1)设计思想说明
设计银行家算法是为了避免死锁
三、实验方法内容 1.算法设计思路
银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待 2.算法流程图
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);//系统安全性的检测
5.主要模块
void inputdata()void showdata()void changdata(int k)void restoredata(int k)int chksec(int s)int chkmax(int s)
四、实验代码
#include #include #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();//检测分配的资源是否合理 void main(){ int i,j;inputdata();for(i=0;i
if(j==0)break;} if(i>=M)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
for(j=0;j
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for(j=0;j
for(i=0;i
AVAILABLE[j]=0;} } }
void showdata(){ int i,j;cout
cout
for(j=0;j
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
{ 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;}
c { 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
for(j=0;j
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;} }
五、实验结果 1.执行结果
2.结果分析 银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁,若发生死锁则让进程等待。
六、实验总结
通过本次银行家算法实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁。实验中遇到点问题,通过查阅资料、询问老师顺利解决。通过这次的实践,使我的理论知识更加的牢固。
操作系统实验:银行家算法姓名:李天玮班级:软工1101 实验内容:在windows系统中实现银行家算法程序。学号:201126630117 实现银行家算法所用的数据结构:假设有5个进程3类资源,则有如......
计算机操作系统实验报告题 目 利用银行家算法避免死锁一、实验目的:1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。2、要求编写和调试......
课程设计报告课程设计名称 共享资源分配与银行家算法 系(部)专业班级姓 名学 号指导教师 年 月 日 、目 录一、课程设计目的和意义 ............................................
计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并......
计算机操作系统实验报告何美西109253030212一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请......