实验二 死锁避免的模拟

一、实验目的

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)程序的截图






评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值