银行家算法C++实现:安全状态判断

本程序使用C++语言实现了银行家算法,用于判断系统是否处于安全状态。程序包含数据输入、数据显示和安全状态判断三个功能。

代码实现

#include <iostream>
#include <string>
#include<algorithm>
#include <iomanip>
#include <Windows.h>
//#include<bits/stdc++.h>
using namespace std;

#define MaxNumber 20

static int n;   //进程数 
static int m;   //资源数 
static int Available[MaxNumber];             //系统可用资源数 

static int Allocation[MaxNumber][MaxNumber]; //已分配资源矩阵 
static int MaxNeed[MaxNumber][MaxNumber];    //最大需求矩阵 
static int Need[MaxNumber][MaxNumber];       //还需资源矩阵 
static int Request[MaxNumber];
static int SafeOrder[MaxNumber];             //安全序列 
static bool Finish[MaxNumber];

void display(){	
	cout<<'----------------------------------------------------------------------'<<endl;
	cout<<'当前进程个数为 n = '<<n<<endl;
	cout<<'当前资源个数为 m = '<<m<<endl;
	cout<<'系统可用资源数:'<<endl;
	for (int i=0;i<m;i++){
		cout<<setw(5)<<char('A'+i)<<' ';
	}
	cout<<endl;
	for ( i=0;i<m;i++){
		cout<<setw(5)<<Available[i]<<' ';
	}
	cout<<endl;
	cout<<'------------------------------------------------------------------------'<<endl;

	cout<<'各进程还需资源数:'<<endl;
	cout<<setw(5)<<' ';
	for ( i=0;i<m;i++){
		cout<<setw(5)<<char('A'+i)<<' ';
	}
	cout<<endl;
	for ( i=0;i<n;i++){
		cout<<setw(5)<<'P'<<i+1;
		for (int j = 0;j<m;j++){
			cout<<setw(5)<<Need[i][j];
		}
		cout<<endl;
	}
}

void input(){
	cout<<'请输入进程数:'<<endl;
	cin>>n;
	cout<<'请输入资源种类数:'<<endl;
	cin>>m;
    cout<<'请输入系统每种可用资源数:'<<endl;
	for (int i=0;i<m;i++){    
		cin>>Available[i];
	}
    cout<<'请输入已分配资源矩阵:'<<endl;
	for ( i=0;i<n;i++){
		for (int j=0;j<m;j++){
			cin>>Allocation[i][j];
		}
	} 
    cout<<'请输入最大需求矩阵:'<<endl;
	for ( i=0;i<n;i++){
		for (int j=0;j<m;j++){
			cin>>MaxNeed[i][j];
		}
	}
	// 
		
	//求解还需资源矩阵 
	for ( i=0;i<n;i++){
		for (int j=0;j<m;j++){
		Need[i][j] = MaxNeed[i][j] - Allocation[i][j];                     //计算T0时刻还需资源矩阵 

		}
	}
	cout<<'*****************************程序开始*******************************'<<endl;
	display();
}

bool isSystemSafe(){
	int work[MaxNumber];
	for (int i=0;i<m;i++){   
		work[i] = Available[i];
	}
	for ( i=0;i<n;i++){
		Finish[i] = false;
		SafeOrder[i] = -1;            //初始化安全序列
	}

	int FinishNumebr = 0;
	int isSafe;
	int j;
	 i =0;
	while(i<n){
		isSafe = 0;
		for(j = 0;j<m;j++){
			if (Finish[i]==false && Need[i][j]<=work[j]){  //  
				isSafe++;
			}
			else
				break;
		}

		if ( isSafe == m){           //  
			Finish[i] = true;
			SafeOrder[FinishNumebr] = i+1;
			FinishNumebr++;
			for (j = 0;j<m;j++){
				work[j] += Allocation[i][j];
			}
			i=0;         //找到满足条件的进程后,从头开始再进行寻找
		}
		else
			i++;

		if (FinishNumebr==n   ){      //
			cout<<'**********************************Safe!******************************'<<endl;	
			cout<<'对应的安全序列为:'<<endl;
			cout<<'P'<<SafeOrder[0];
			for (int i=1;i<n;i++){
				cout<<'-->'<<'P'<<SafeOrder[i] ;
			}
			cout<<endl;
			return true;
		}
	}

	cout<<'******************************unSafe!******************************'<<endl;	
	return false;
}

int main(){
	input();
	isSystemSafe();
	system('pause'); 
	return 0;
}
/*
input:
4 
3
0 1 1
1 0 0
6 1 2
2 1 1
0 0 2
3 2 2
6 1 3
3 1 5
4 2 2
*/

函数分析

  • 数据输入函数:void input()

    该函数负责从用户输入获取银行家算法所需的数据,包括进程数、资源种类数、系统可用资源数、已分配资源矩阵和最大需求矩阵。

  • 数据显示函数:void display()

    该函数负责将程序中使用到的关键数据信息进行展示,包括进程数、资源种类数、系统可用资源数以及各进程还需资源数。

  • 判断系统是否为安全态的函数:bool isSystemSafe()

    该函数实现银行家算法的核心逻辑,用于判断当前系统是否处于安全状态。具体做法是模拟系统运行,检查是否存在一种进程执行顺序,能够使所有进程顺利完成并释放资源。

    函数返回 true 表示系统处于安全状态,反之则处于不安全状态。

总结

本程序使用C++语言实现了银行家算法,可以帮助用户判断系统是否处于安全状态。代码中包含了数据输入、数据显示和安全状态判断三个功能,结构清晰易懂,可以作为学习银行家算法的参考。

银行家算法C++实现:安全状态判断

原文地址: https://www.cveoy.top/t/topic/odxT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录