一、实验目的
1)深入了解死锁的原因和必要条件。
2)掌握死锁的处理方式。
3)实现死锁避免的模拟
二、实验预备知识
1)系统安全状态
2)银行家算法
三、实验内容
验证银行家算法避免系统死锁。
假设系统中有三类资源A、B、C和五个进程P1、P2、P3、P4、P5。然后设定每种资源的数量。之后设定每个进程对各类资源的最大需求,最后假定在某一时刻,系统已经给各个进程分配多少资源。要求检查该时刻系统是否处于安全状态。
四、实验要求
1) 给出程序流程和源程序(附有详细注释)
2) 程序运行截图
3) 收获、体会及对该实验的改进意见和见解
五、实验提示
由于是实验,没有真正的避免死锁。所以在实验中首先假定一种系统状态,假设T0时刻资源的分配情况如下所示:
要求实现:
(1)确定系统在T0时刻的安全性。
(2)P1发出资源请求向量Request1(1,0,2),按照银行家算法确定能否将资源分配给P1。
(3)在(2)的基础上, P4发出请求向量Request4(3,3,0),按照银行家算法确定能否将资源分配给P1。
(4)再(3)的基础上,P0发出请求向量Request0(0,2,0),按照银行家算法确定能否将资源分配给P1。
(1)程序的代码
#include<iostream>
using namespace std;
int Max[5][3];// 每个进程对各类资源的最大需求
int allocation[5][3];// 已经分配的资源的数量
int need[5][3];
int sum[3];
int available[3];
int request[3]={0};// 表示资源请求的数目
int r = 0;// 表示请求资源的进程
int safelist[5];// 表示安全序列
void inital()// 初始化所有资源的数量
{
cout << "请分别输入的A、B、C资源的数量:";
for(int i = 0;i<3;i++)
{
cin >> sum[i];
}
for(int i = 0;i<5;i++)
{
cout << "请输入进程Process[" << i+1 << "]需要A、B、C资源的最大数目:";
for(int j = 0;j<3;j++)
{
cin >> Max[i][j];
}
}
int add[3] = {0,0,0};
for(int i = 0;i<5;i++)
{
cout << "请输入进程Process[" << i+1 << "]当前已分配的资源的数目:";
for(int j = 0;j<3;j++)
{
cin >> allocation[i][j];
}
}
for(int i = 0;i<3;i++)
{
for(int j = 0;j<5;j++)
{
add[i] += allocation[j][i];
}
}
for(int i = 0;i<5;i++)
{
for(int j = 0;j<3;j++)
{
need[i][j] = Max[i][j] - allocation[i][j];
}
}
for(int i = 0;i<3;i++)
{
available[i] = sum[i] - add[i];
}
}
void display()
{
cout<<endl<<endl;
cout<<" ┏ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┠ 银行家算法 ┨"<<endl;
cout<<" ┠ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┨"<<endl;
cout<<" ┠ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┨"<<endl;
cout<<" ┃ 资源 ┃ Max ┃ Alloc ┃ Need ┃ Avia ┃"<<endl;
cout<<" ┃ 进程 ┃ A B C ┃ A B C ┃ A B C ┃ A B C ┃"<<endl;
for (int i=0;i<5;i++)
{
if(i == 0)
{
cout<<" ┃ "<<"Process["<<i+1<<"] ";
cout<<"┃ "<<Max[i][0]<<" "<<Max[i][1]<<" "<<Max[i][2];
cout<<" ┃ "<<allocation[i][0]<<" "<<allocation[i][1]<<" "<<allocation[i][2];
cout<<" ┃ "<<need[i][0]<<" "<<need[i][1]<<" "<<need[i][2]<<" ┃ ";
cout<<available[0]<<" "<<available[1]<<" "<<available[2]<<" ┃" << endl;
}
else
{
cout<<" ┃ "<<"Process["<<i+1<<"] ";
cout<<"┃ "<<Max[i][0]<<" "<<Max[i][1]<<" "<<Max[i][2];
cout<<" ┃ "<<allocation[i][0]<<" "<<allocation[i][1]<<" "<<allocation[i][2];
cout<<" ┃ "<<need[i][0]<<" "<<need[i][1]<<" "<<need[i][2]<<" ┃ "<< " ┃" << endl;
}
}
cout<<" ┠━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┨"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┛"<<endl;
}
// 安全性检测
bool safe()
{
// work finish数组
int work[3] = {0};
for(int i = 0;i<3;i++)
{
work[i] = available[i];
}
bool finish[5];
for(int i = 0;i<5;i++)
{
finish[i] = false;
safelist[i] = 0;
}
// 安全性检测
int k = 0,j = 0,a = 0;
while(j<5)
{
j = 0;
k = 0;
while(k<3)
{
if(finish[j]==false&&need[j][k]<=work[k])
{
if(k == 2)
{
for(int m = 0;m<3;m++)
{
work[m]+= allocation[j][m];
}
finish[j]=true;
safelist[a]=j + 1;
a++;
}
k++;
}
else
{
j++;
k = 0;
}
}
}
if(j == 5)
return false;
for (int i=0;i<5;i++)
{
if(finish[i] == false)
return false;
}
return true;
}
// 发出资源请求
void requestprocess()
{
//保存原来数据
int oldavailable[3]={0};
int oldallocation[5][3]={0};
int oldneed[5][3]={0};
for (int i=0;i<3;i++)
{
oldavailable[i]=available[i];
for (int j=0;j<5;j++)
{
oldallocation[j][i]=allocation[j][i];
oldneed[j][i]=need[j][i];
}
}
//更新Available allocation[] need[]
for (int i=0;i<3;i++)
{
available[i]-=request[i];
allocation[r-1][i]+=request[i];
need[r-1][i]-=request[i];
}
//安全性分析
if (false==safe())
{
for (int i=0;i<3;i++)
{
available[i]=oldavailable[i];
for (int j=0;j<5;j++)
{
allocation[j][i]=oldallocation[j][i];
need[j][i]=oldneed[j][i];
}
}
system("cls");
cout << "系统进入不安全状态,此时系统不分配资源" << endl;
display();
}
else
{
system("cls");
cout << "系统进入安全状态,此时系统分配资源的安全序列为:【 ";
for(int i = 0;i<5;i++)
{
cout << "Process["<<safelist[i] << "] ";
}
cout << "】" << endl;
display();
}
}
void safeinit()// 判断初识的安全性状态
{
if(true == safe())
{
cout << "系统进入安全状态,此时系统分配资源的安全序列为:【 ";
for(int i = 0;i<5;i++)
{
cout << "Process["<<safelist[i] << "] ";
}
cout << "】" << endl;
}
else
{
cout << "输入的数目会使系统进入不安全状态,请重新输入!!!" << endl;
}
}
int main()
{
inital();
system("cls");
safeinit();
display();
int ex = 1;
while(1)
{
if(ex == 0)
break;
else if(safe() == true)
{
cout << "请输入发起资源申请的进程号(1-5):";
cin >> r;
if (r<=0||r>5)
cout << "请输入合法的进程!!!" << endl;
cout << "请分别输入的申请A、B、C资源的数目:";
for (int i=0;i<3;i++)
{
cin >> request[i];
}
int a = 0,b = 0;
for (int i=0;i<3;i++)
{
if(request[i]>need[r-1][i])// Request<=Need 不满足
{
a = 1;
break;
}
if(request[i]>available[i])// Request<=Available不满足
{
b = 1;
break;
}
}
if(a == 1)
{
system("cls");
cout << "Request<=Need 不满足!!!" << endl;
display();
}
else if(b == 1)
{
system("cls");
cout << "Request<=Available不满足!!!"<< endl;
display();
}
else
requestprocess();
cout << "【请选择程序是否继续执行】1(是) 0(否):";
cin >> ex;
}
}
return 0;
}
(2)程序的截图