操作系统之银行家算法检测死锁.docx
《操作系统之银行家算法检测死锁.docx》由会员分享,可在线阅读,更多相关《操作系统之银行家算法检测死锁.docx(14页珍藏版)》请在冰豆网上搜索。
操作系统之银行家算法检测死锁
操作系统实验
利用银行家算法避免死锁
实验报告
1、实验题目:
利用银行家算法避免死锁
2、实验内容:
编程实现银行家算法,要求能够输入资源数和作业数,输出进程的安全状况。
若进程安全,输出安全序列。
3、实验目的:
通过实验加强对银行家算法避免死锁的理解和掌握。
4、实验过程:
1、基本思想:
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
详细如下:
设进程i提出请求Request[j],则银行家算法按如下规则进行判断。
(1)如果Request[i][j]<=Need[i][j],则转
(2);否则出错。
(2)如果Request[i][j]<=Available[j],则转(3);否则出错。
(3)系统试分配资源,修改相关数据:
Available[j]=Available[j]-Request[i][j];
Allocation[i][j]=Allocation[j]+Request[i][j];
(4)系统执行安全性检查,如安全,则分配成立;否则试分配作废,系统恢复原状,进程等待。
安全性检查算法
(1)设置两个工作向量Work=Available;Finish[i]=false
(2)从进程集合中找到一个满足下述条件的进程, Finish==false; Need<=Work; 如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=Allocation Finish=true; GOTOstep2
(4)如所有的进程Finish=true,则表示安全;否则系统不安全。
2、主要数据结构:
(1)可利用资源向量Available。
定义为一个一元数组,Available[j]=K表示系统中有j类资源K个。
(2)最大需求Max。
定义为一个n*m的矩阵,Max[i][j]=K表示进程i需要j资源的最大数目为K个。
(3)分配矩阵Allocation。
定义为一个n*m的矩阵,Allocation[i][j]=K表示进程i已经得到j资源K个。
(4)需求矩阵Need。
定义为一个n*m的矩阵,Need[i][j]=K表示进程i还需要j资源K个来完成任务。
3、输入、输出:
(1)成功分配的例子:
输入资源数2(各3),进程数2,最大需求11,已分配01。
输出:
1110
MaxAllocationNeed
进程名ABABAB
0110110
1111001
(2)不安全,会出现死锁的:
输入资源数2(各2),进程数2,最大需求33,已分配00。
输出:
3300
MaxAllocationNeed
进程名ABABAB
0330033
1330033
没有安全序列
(3)若输入时已分配大于最大需求:
输入资源数1(5个资源),进程数1,Max=3,Allocation=5,则会产生提示,发生错误,申请的大于最大需求量。
需要重新输入。
4、
程序流程图
大于最大需求
小于最大需求
未通过
通过
5、实验结果截屏
6、源程序代码(共214行)
#include
#include
#include
#defineFalse0
#defineTrue1
usingnamespacestd;
intMax[100][100]={0};//各进程所需各类资源的最大需求;
intAvaliable[100]={0};//系统可用资源;
charname[100]={0};//资源的名称;
intAllocation[100][100]={0};//系统已分配资源;
intNeed[100][100]={0};//还需要资源
intRequest[100]={0};//请求资源向量;
inttemp[100]={0};//存放安全序列;
intWork[100]={0};//存放系统可提供资源;
intM=100;//作业的最大数
intN=100;//资源的最大数
voidshowdata()//显示资源矩阵
{
inti,j;
cout<<"系统可用资源[Available]:
"<for(i=0;icout<cout<for(j=0;jcout<cout<cout<<"MaxAllocationNeed"<cout<<"进程名";
for(j=0;j<3;j++)//MAXALLOCATIONNEED共列
{
for(i=0;i{
cout<}
cout<<"";
}
cout<for(i=0;icout<<""<
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<}
}
intchangedata(inti)//进行资源分配;
{
intj;
for(j=0;j{
Avaliable[j]=Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
}
return1;
}
intsafe()//安全性算法
{
intk=0,m,apply,Finish[100]={0};
intj;
for(inti=0;i{
Work[i]=Avaliable[i];
}
for(inti=0;i{
apply=0;
for(intj=0;j{
if(Finish[i]==False&&Need[i][j]<=Work[j]){
apply++;//经过验证之后apply会增加到和资源数相等
if(apply==N){
for(m=0;mWork[m]=Work[m]+Allocation[i][m];//释放可用资源
Finish[i]=True;//置安全
temp[k]=i;//记录安全进程名
i=-1;//让i跳出资源层循环时回到初始状态
k++;//安全序列下标前进位
}
}
}
}
for(inti=0;iif(Finish[i]==False){
cout<<"系统不安全;"<return-1;
}
}
cout<<"系统是安全的!
"<cout<<"分配的序列:
";
for(inti=0;icout<if(i";
}
cout<return0;
}
voidshare()//判定申请资源
{
charch;
inti=0,j=0;
ch='y';
cout<<"请输入要求分配的资源进程号(0-"<";
cin>>i;//输入须申请的资源号;
cout<<"请输入进程"<
"<for(intj=0;j{
cout<";
cin>>Request[j];//输入需要申请的资源数目;
}
for(intj=0;j{
if(Request[j]>Need[i][j])
{
cout<<"进程"<
cout<<"不予分配!
"<ch='n';
break;
}
else{
if(Request[j]>Avaliable[j])//申请是否大于当前资源
{
cout<<"进程"<
cout<<"不予分配!
"<ch='n';
break;
}
}
}
if(ch=='y')
{
changedata(i);
showdata();
safe();
}
}
intmain(){
inti,j,number,m,n,flag;
intchoice=1;//选择或者、
charmc;//资源名称
cout<<"**************银行家算法开始***************"<cout<<"输入系统可供资源种类的数量:
";
cin>>n;
N=n;
for(i=0;i{
cout<<"资源"<
";
cin>>mc;
name[i]=mc;
cout<<"资源的数量:
";
cin>>number;
Avaliable[i]=number;
}//endfor
cout<cout<<"请输入作业的数量:
";
cin>>m;
M=m;
cout<<"请输入各进程的最大需求量("<"<for(inti=0;ifor(intj=0;jcin>>Max[i][j];
}
do{
flag=0;
cout<<"请输入各进程已经分配资源量("<"<for(inti=0;ifor(j=0;j{
cin>>Allocation[i][j];
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
cout<<"首次输入的已分配资源已经大于最大需求量,请重新输入!
\n";
}while(flag);//当申请资源符合要求时,flag恒,enddo
showdata();//显示
safe();//安全检测
while(choice){
cout<<"**************银行家算法***************"<cout<<"1:
分配资源"<cout<<"2:
显示状态"<cout<<"0:
离开"<cout<<"*******************************************"<cout<<"请选择功能号:
";
cin>>choice;
switch(choice){
case1:
share();break;
case2:
{cout<<"*******************************************"<";showdata();break;}
case0:
choice=0;break;
default:
cout<<"请正确选择功能号(0,1,2)!
"<}
}
return1;
}