一、实验名称:资源分配管理
二、实验目的与要求
目的:通过本次实验,使学生加深了对死锁概念的理解和掌握,深刻领会银行家算法的实质及实现过程。
要求:编写一个系统动态分配资源的简单模拟程序,采用银行家算法防止死锁。
三、实验内容
设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。在T0时刻的资源分配情况如下图所示:
(1)若进程P1请求资源,发出请求向量Request1(1,0,2),编写程序用银行家算法判断系统能否将资源分配给它;
(2)若进程P2提出请求Request2(0,1,0),用银行家算法程序验证系统能否将资源分配给它。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列。
#include
using namespace std;
int Max[5][3]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};
int Need[5][3]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};
int Allocation[5][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
int Available[3]={3,3,2};
bool finish[5]={false,false,false,false,false};
int work[3];
bool Safety() //安全性算法
{
for(int i=0;i<3;i++) // 执行时,工作向量work=Available
{
work[i]=Available[i];
}
for(int i=0;i<5;i++)
{
if(finish[i]==false&&Need[i][0]<=work[0]&&Need[i][1]<=work[1]&&Need[i][2]<=work[2]) //满足条件释放进程
{
work[0]+=Allocation[i][0]; //释放A,B,C类资源
work[1]+=Allocation[i][1];
work[2]+=Allocation[i][2];
cout<<"可利用资源数"<<"A:"<<work[0]<<" "<<"B:"<<work[1]<<" "<<"C:"<<work[2]<<endl;
finish[i]=true;
cout<<"P"<<i<<"释放"<<endl;
i=-1; //有一个进程释放了重头考试找满足finish[i]=false,Need<=work的进程
}
}
bool k=true;
for(int i=0;i<5;i++)
{
if(finish[i]==false) //判断是否有进程没有释放
{
k=false;
break;
}
}
if(k==false) //有进程没有释放返回false
{
return false;
}
else //进程释放完返回true
{
return true;
}
}
void Request(int i,int a,int b,int c) //申请资源函数
{
if(Need[i][0]>=a&&Need[i][1]>=b&&Need[i][2]>=c) //若满足条件试着对资源进行分配,然后判断是否满足安全性算法
{
if(Available[0]>=a&&Available[1]>=b&&Available[2]>=c) //满足条件对资源进行配
{
Available[0]=Available[0]-a; //对资源进行分配
Available[1]=Available[1]-b;
Available[2]=Available[2]-c;
Allocation[i][0]=Allocation[i][0]+a;
Allocation[i][1]=Allocation[i][1]+b;
Allocation[i][2]=Allocation[i][2]+c;
Need[i][0]=Need[i][0]-a;
Need[i][1]=Need[i][1]-b;
Need[i][2]=Need[i][2]-c;
if((Allocation[i][0]==Max[i][0])&&(Allocation[i][1]==Max[i][1])&&(Allocation[i][2]==Max[i][2])) //判断进程是否满足释放条件
{
Available[0]=Available[0]+Allocation[i][0]; //释放A,B,C类资源
Available[1]=Available[1]+Allocation[i][1];
Available[2]=Available[2]+Allocation[i][2];
finish[i]=true;
cout<<“P”<<i<<“释放”<<endl;
}
if(Safety()==false) //若不满足安全性算法,回收所分配的资源
{
Available[0]=Available[0]+a; //回收分配的资源
Available[1]=Available[1]+b;
Available[2]=Available[2]+c;
Allocation[i][0]=Allocation[i][0]-a;
Allocation[i][1]=Allocation[i][1]-b;
Allocation[i][2]=Allocation[i][2]-c;
cout<<“申请之后,系统处于不安全状态”<<endl;
}
else
{
cout<<“申请之后,系统处于安全状态”<<endl;
}
}
else //可利用资源小于申请资源,进程等待
{
cout<<“无足够资源,P”<<i<<“等待”<<endl;
}
}
else //申请的资源大于京城所需要的资源
{
cout<<“申请资源超过最大值”<<endl;
}
}
int main()
{
//T0时刻
//输入Max
int a,b,c,d;
cout<<"请输入要申请资源的进程:";
cin>>d;
cout<<"输入申请A类资源的个数:";
cin>>a;
cout<<"输入申请B类资源的个数:";
cin>>b;
cout<<"输入申请C类资源的个数:";
cin>>c;
Request(d,a,b,c);
return 0;
}
运行结果
(1)若进程P1请求资源,发出请求向量Request1
(1,0,2),编写程序用银行家算法判断系统能否将资源分配给它;
(2)若进程P2提出请求Request2(0,1,0),用银行家算法程序验证系统能否将资源分配给它。