利用银行家算法避免死锁.docx
《利用银行家算法避免死锁.docx》由会员分享,可在线阅读,更多相关《利用银行家算法避免死锁.docx(10页珍藏版)》请在冰豆网上搜索。
![利用银行家算法避免死锁.docx](https://file1.bdocx.com/fileroot1/2023-6/19/0c794b54-8652-40b2-9a5c-7ea2d1ebf3f9/0c794b54-8652-40b2-9a5c-7ea2d1ebf3f91.gif)
利用银行家算法避免死锁
利用银行家算法避免死锁
一、实验题目:
利用银行家算法避免死锁
二、实验内容:
银行家算法、安全性算法
3、实验目的
熟悉及模拟实现银行家算法,实现资源分配,理解系统产生死锁的原因,提高编程能力。
4、实验过程:
1、基本思想
(1)如果Requesti[j]<=need[i][j],则转
(2);否则,出错。
(2)如果Requesti[j]<=Available[j],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
Available[j]-=Requesti[j];
Alloctioan[i][j]+=Requesti[j];
need[i][j]-=Requesti[j];
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
2、主要数据结构
booltest_Request(int*,int*);//测试函数
voidfenpei();//分配函数
boolsafe_check();//安全检测函数
voidrecover(int);//回收函数
boolcheck_finish();//检测finish函数
intfinish[10];//已完成的进程序列
intwork[10];//进程工作序列
intmmax[10][10];//进程最大需求
intAlloctioan[10][10];//进程已得到的
intneed[10][10];//进程还需分配的
intAvailable[10];//系统拥有的资源
intn;//告诉系统第几个进程需要申请
Inth;intk;//h为进程数目;k为资源数目
intRequest[10];
3、输入、输出(文字描述)
1)输入进程m和资源n;
2)分别输入矩阵mmax,Alloctioan,Available,
3)输入需要申请的进程p,如果p不在范围内则提示“输入错误,请重新输入进程序号:
”。
4)输入Request[i]需要资源的数目,如果Request[i]不符合判定要求则输出"系统资源不足!
或超过最大需求资源值",
5)如果预分配是安全的就输出"不会产生死锁,安全进程队列为:
"和序列号,否则输出"产生死锁!
!
"。
4、程序流程图(必要的描述)
5、截屏(输入、输出)
6、源程序
#include"stdafx.h"
#include
usingnamespacestd;
booltest_Request(int*,int*);//测试函数
voidfenpei();//分配函数
boolsafe_check();//安全检测函数
voidrecover(int);//回收函数
boolcheck_finish();//检测finish函数
intfinish[10]={0,0,0,0,0,0,0,0,0,0};//已完成的进程序列
intwork[10];//进程工作序列
intmmax[10][10];//进程最大需求
intAlloctioan[10][10];//进程已得到的
intneed[10][10];//进程还需分配的
intAvailable[10]={0,0,0,0,0,0,0,0,0,0};//系统拥有的资源
intn;//告诉系统第几个进程需要申请
Inth;intk;//h为进程数目;k为资源数目
intRequest[10];
intmain()
{cout<<"请输入进程数m(m<=10),资源数n(n<=10)";
cout<cin>>h>>k;
cout<<"请输入mmax的值"<for(inti=0;i{for(intj=0;jcin>>mmax[i][j];
}
cout<<"请输入Alloctioan的值"<for(inti=0;i{
for(intj=0;jcin>>Alloctioan[i][j];
}
for(inti=0;ifor(intj=0;jneed[i][j]=mmax[i][j]-Alloctioan[i][j];
cout<<"need"<for(inti=0;i{
for(intj=0;jcout<cout<}
cout<<"Available"<for(inti=0;iCin>>Available[i];
cout<";
cin>>n;
while(n<0||n>h)//输入正确的进程序号
{
cout<<"输入错误,请重新输入进程序号:
";
cin>>n;
}
n=n-1;
cout<<"输入该进程所要申请的各资源数:
"<for(intj=0;jcin>>Request[j];
cout<if(test_Request(Request,Available)&&test_Request(Request,need[n]))//调用booltest_Request(int*p,int*q)来比较
{
fenpei();
if(safe_check())//调用boolsafe_check()安全算法
{cout<<"不会产生死锁,安全进程队列为:
"<for(inta=0;acout<<"P"<}
else
cout<<'\a'<<"产生死锁!
!
";
}
else
{
cout<<"系统资源不足!
或超过最大需求资源值";
for(intm=0;m{
need[n][m]+=Request[m];
Available[m]+=Request[m];
Alloctioan[n][m]-=Request[m];;
}
}
intx;
cin>>x;
}
booltest_Request(int*p,int*q)//用指针来比较返回bool值
{
for(intm=0;m{
if(*(p+m)>*(q+m))
return0;
if(*(p+m)<=*(q+m)&&m==k-1)
return1;
}
}
voidfenpei()//fenpei函数来试着分配
{
for(intm=0;m{
need[n][m]-=Request[m];
Available[m]-=Request[m];
Alloctioan[n][m]+=Request[m];;
}
}
boolsafe_check()//安全算法
{
inti,j=0;
while
(1)
{
for(i=0;iif(test_Request(need[i],Available)&&finish[i]==0)
break;
if(i{
recover(i);
finish[i]=1;
work[j]=i+1;
j++;
}
if(i>=h)
{
if(check_finish())//调用check_finish()
returntrue;
else
returnfalse;
}
}
}
voidrecover(inti)
{
for(intm=0;mAvailable[m]+=Alloctioan[i][m];
}
boolcheck_finish()
{
for(inti=0;i{
if(finish[i]==0)
returnfalse;
else
if(finish[i]!
=0&&i==h-1)
returntrue;
}
}
7、实验小结
通过学习了操作系统的原理及知识后,对操作系统有了进一步的了解,在原理的基础上我们采用模拟的方法来编写关于银行家算法的程序,锻炼了我们的操作动手能力,加强了对书本知识的了解,把书本内容应用到实际操作上,同时也训练了我们的变成能力。
操作系统确实是一门高深的学问,值得我们去不断的学习,研究。