首页 > 编程语言 >操作系统:银行家算法(避免死锁)

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

时间:2022-12-07 16:01:03浏览次数:42  
标签:return 操作系统 ++ Request 死锁 cin int 算法 cout


算法介绍:

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

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

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

程序实现:

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

程序:银行家算法实现
作者:小单
时间: 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;

}


程序测试结果如下:


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

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

操作系统:银行家算法(避免死锁)_初始化_06

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

操作系统:银行家算法(避免死锁)_初始化_08

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

标签:return,操作系统,++,Request,死锁,cin,int,算法,cout
From: https://blog.51cto.com/u_15905375/5919636

相关文章

  • KMP算法详解-字符串匹配
    1.什么是KMP是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP2.KMP的用处KMP主要用于字符串匹配。KMP的主要思想是当出现字符串不匹......
  • 算法练习:两指针之有序数组去重
    问题描述给出一个有序数组,就地移除重复元素,保持每个元素只出现一次,并返回新数组的长度。 问题分析这个比较简单,直接使用两个指针,一个在前,一个在后,扫描一遍数组即可。时间复......
  • 算法练习:两指针之三色排序
    问题描述输入一个整型数组,每个元素在0~2之间,其中0,1,2分别代表红、白、蓝。现要求对数组进行排序,相同颜色的在一起,而且按红白蓝顺序先后排列。要求时间复杂度为O(n)。 问题分......
  • 五. 排序算法
    1.定义:1.1原地排序和非原地排序def.原地排序算法使用恒定的的额外空间来产生输出。原地排序:选择排序,插入排序,希尔排序,快速排序,堆排序。非原地排序:归并排序,计数排序,基数排......
  • 一致性哈希算法详解
    一致性哈希是什么,使用场景,解决了什么问题?转载:https://mp.weixin.qq.com/s/hJHMlbQpANwMjx9BetwkUg 1.如何分配请求大多数网站背后肯定不是只有一台服务器提供服务,因......
  • 数据挖掘算法-KNN算法
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 机器学习--Kmeans聚类算法
    1.1概述K-means算法是集简单和经典于一身的基于距离的聚类算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象......
  • 机器学习--CF协同过滤推荐算法原理
    1.1概述什么是协同过滤(CollaborativeFiltering,简称CF)?首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最......
  • 算法基础课
    给定nn个正整数aiai,请你输出这些数的乘积的约数之和,答案对109+7109+7取模。输入格式第一行包含整数nn。接下来nn行,每行包含一个整数aiai。输出格式输出一个......
  • Vue中的diff算法深度解析
    模板tamplate经过parse,optimize,generate等一些列操作之后,把AST转为renderfunctioncode进而生成虚拟VNode,模板编译阶段基本已经完成了,那么这一章,我们来探讨一下Vue中的一......