操作系统:银行家算法(避免死锁)

算法介绍:


程序实现:

/*****************************************************

			程序:银行家算法实现
			作者:小单
			时间: 2013年11月5日

******************************************************/
#include <iostream>
#include <string>
using namespace std;

#define MAXPROCESS  50  //所能执行的进程最大数
#define MAXRESOURCE 50  //资源最大数

//银行家算法中的数据结构
int Available[MAXRESOURCE];  //可用资源向量
int Max[MAXPROCESS][MAXRESOURCE];   //最大需求矩阵
int Allocation[MAXPROCESS][MAXRESOURCE];  //分配矩阵
int Need[MAXPROCESS][MAXRESOURCE];   //需求矩阵
int Request[MAXPROCESS][MAXRESOURCE];  //请求向量

//安全性算法中的数据结构
int Work[MAXRESOURCE];    //工作向量
bool Finish[MAXPROCESS];    //表示是否有足够的资源分配给进程
int SafeSeries[MAXPROCESS];  //安全序列


int n;  //当前系统中的进程数
int m;   //当前系统中的资源数



//
//算法初始化
void InitAlgorithm()
{
	cout << "请输入系统所要运行的进程总数:";
	cin >> n;
	cout << "请输入系统中分配的资源种类数:";
	cin >> m;
	int i,j;

	//可利用资源向量的初始化
	cout << "请分别输入" << m << "类资源的当前可利用资源数目:";
	for( i = 0; i < m; ++i )
	{
		cin >> Available[i];
	}

	//最大需求矩阵的初始化
	cout << "请输入各进程对各资源的最大需求矩阵(按"
		<< n << "*" << m << "矩阵格式输入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Max[i][j];
		}
	}

	//分配矩阵的初始化
	cout << "请输入分配矩阵(按"
		<< n << "*" << m << "矩阵格式输入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Allocation[i][j];
		}
	}

	//需求矩阵的初始化
	cout << "请输入此刻的需求矩阵(按"
	<< n << "*" << m << "矩阵格式输入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Need[i][j];
		}
	}

}

//输出资源分配情况
void PrintSrcAlloc()
{
	int i,j;
	for( i = 0; i < n; ++i )
	{
		cout << "进程P" << i << "的总体分配情况:" << endl;
		cout << "\tMax: ";
		for( j = 0; j < m; ++j )
		{
			cout << Max[i][j] << " ";
		}
		cout << endl;

		cout << "\tAllocation:";
		for( j = 0; j < m; ++j )
		{
			cout << Allocation[i][j] << " ";
		}
		cout << endl;

		cout << "\tNeed:";
		for( j = 0; j < m; ++j )
		{
			cout << Need[i][j] << " ";
		}
		cout << endl;
		cout << endl;
	}

	cout << "可利用资源情况:";
	for( i = 0; i < m; ++i )
	{
		cout << Available[i] << " ";
	}
	cout << endl;
	cout << endl;

}

//输出此时进程iProcess利用安全性算法的分析情况
void PrintSafeSeries( int iProcess )
{
	int j;
	cout << "进程P" << iProcess << "的安全性分析情况:" << endl;
	cout << "\tWork: ";
	for( j = 0; j < m; ++j )
	{
		cout << Work[j] << " ";
	}
	cout << endl;
	
	cout << "\tNeed:";
	for( j = 0; j < m; ++j )
	{
		cout << Need[iProcess][j] << " ";
	}
	cout << endl;
	
	cout << "\tAllocation:";
	for( j = 0; j < m; ++j )
	{
		cout << Allocation[iProcess][j] << " ";
	}
	cout << endl;
	
	cout << "\tWork + Allocation:";
	for( j = 0; j < m; ++j )
	{
		cout << Work[j] + Allocation[iProcess][j] << " ";
	}
	cout << endl;

	cout << "Finish[" << iProcess << "] = " << Finish[iProcess] << endl;
	cout << endl;


}

//判断是否存在安全序列
bool IsSafe()
{
	int i;
	for( i = 0; i < n; ++i )
	{
		if( !Finish[i] )
			return false;  //不存在安全序列
	}
	return true;//存在安全序列
}

//界面
void Menu()
{
	cout << "\t\t ==========================================="  << endl;
	cout << "\t\t|                                           |" << endl;
	cout << "\t\t|         程序:银行家算法的模拟实现        |" << endl;
	cout << "\t\t|         作者:小单                        |" << endl;
	cout << "\t\t|         时间:2013.11.5                   |" << endl;
	cout << "\t\t|                                           |" << endl;
	cout << "\t\t ==========================================="  << endl;
}


//选出满足条件的进程
//函数返回进程编号
//若不存在满足条件的,则返回false,否则返回true
bool SelectProcess( int &iProcNum )
{
	iProcNum = -1;
	int i, j;
	for( i = 0; i < n; ++i )
	{
  		if ( Finish[i] )  //Finish[i] != false
		{
			continue;
		}
		for ( j = 0; j < m; ++j )
		{
			if ( Need[i][j] > Work[j] )
			{
				break;
			}
		}
		if ( j == m )  //满足条件
		{
			iProcNum = i;
			return true;  
		}
	}
	return false;
}

//安全性算法
bool SafeAlgorithm()
{
	int i,j;

	//初始化Finish向量
	for( i = 0; i < n; ++i )
	{
		Finish[i] = false;
	}

	//初始化工作向量
	for ( j = 0; j < m; ++j )
	{
		Work[j] = Available[j];
	}

	int iProcNum;
	//选择满足条件的进程
	i = 0;
	while( SelectProcess( iProcNum) )
	{
		Finish[iProcNum] = true;
		PrintSafeSeries( iProcNum );  //输出此时利用安全性算法的分析情况
		int k;
		for ( k = 0; k < m; ++k )
		{
			Work[k] += Allocation[iProcNum][k];
		}
		SafeSeries[i++] = iProcNum;  //进程号加入安全序列数组

		
	}

	if( IsSafe() )
	{
		return true;  //存在一个安全序列
	}

	return false;  //不存在一个安全序列

}


//银行家算法
void BankAlgorithm()
{
	int i,j;
	cout << "请输入请求分配的进程号(0 - " << n-1 << "): ";
	cin >> i;
	cout << "请依次输入进程P" << i << "对" << m << "类资源的请求分配量: ";
	for( j = 0; j < m; ++j )
	{
		cin >> Request[i][j];
	}

	//步骤一
	for( j = 0; j < m; ++j )
	{
		if( Request[i][j] > Need[i][j] )
		{
			cout << "请求的资源已超过该资源宣布的最大值,请求资源失败!!" << endl;
			return;
		}
	}

	//步骤二
	for( j = 0; j < m; ++j )
	{
		if( Request[i][j] > Available[j] )
		{
			cout << "没有足够的资源,请求资源失败!!" << endl;
			return;
		}
	}

	//步骤三
	//系统试探着把资源分配给进程Pi,并修改相应的数值
	for ( j = 0; j < m; ++j )
	{
		Available[j] -= Request[i][j];
		Allocation[i][j] += Request[i][j];
		Need[i][j] -= Request[i][j];
	}

	//步骤四
	//系统执行安全性算法
	if ( !SafeAlgorithm() ) //检测到不安全,则恢复原来的状态
	{
		for ( j = 0; j < m; ++j )
		{
			Available[j] += Request[i][j];
			Allocation[i][j] -= Request[i][j];
			Need[i][j] += Request[i][j];
		}	
	}

}



int main()
{
	Menu();
	InitAlgorithm();
	PrintSrcAlloc();  //打印当前资源情况
	system("pause");
	SafeAlgorithm();
	while(1)
	{
		string flag;
		if( IsSafe() )
		{
			//存在安全序列
			cout << "恭喜!!资源分配成功!!" << endl;
			int i;
			cout << "此时刻存在的一个安全序列为:";
			for ( i = 0; i < n - 1; ++i )
			{
				cout << "P" << SafeSeries[i] << "-->";
			}
			cout << "P" << SafeSeries[i] << endl;
			cout << "继续操作吗?[Y/N]:";
			cin >> flag;
		}
		else
		{
			cout << "资源分配失败!!" << endl;
			cout << "继续操作吗?[Y/N]:";
			cin >> flag;
		}

		if ( flag == "Y" || flag == "y" )
		{
			;
		}
		else
		{
			break;
		}
		BankAlgorithm(); //执行银行家算法

	}


	return 0;

}

程序测试结果如下:


  • 19
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
银行家算法 1. 实验目的和要求 银行家算法避免死锁的一种重要方法,要求编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁避免死锁的具体实施方法。 2. 实验内容 1.设计进程对各类资源最大申请表示及初值确定。 2.设定系统提供资源初始状况。 3.设定每次某个进程对各类资源的申请表示。 4.编制程序,依据银行家算法,决定其申请是否得到满足。 3. 实验说明 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。 4. 参考程序 #include "string.h" #include "iostream.h" #define M 5 //总进程数 #define N 3 //总资源数 #define FALSE 0 #define TRUE 1 //M个进程对N类资源最大资源需求量 int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //系统可用资源数 int AVAILABLE[N]={10,5,7}; //M个进程已经得到N类资源的资源量 int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //M个进程还需要N类资源的资源量 int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; int Request[N]={0,0,0};

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值