银行家算法C++实现:安全状态判断
银行家算法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++语言实现了银行家算法,可以帮助用户判断系统是否处于安全状态。代码中包含了数据输入、数据显示和安全状态判断三个功能,结构清晰易懂,可以作为学习银行家算法的参考。
原文地址: https://www.cveoy.top/t/topic/odxT 著作权归作者所有。请勿转载和采集!