计算机操作系统>一书中详细有解.
1. 安全状态: 在某时刻系统中所有进程可以排列一个安全序列:{P1,P2,`````Pn},刚称此时,系统是安全的.
所谓安全序列{P1,P2,`````Pn}是指对于P2,都有它所需要剩余资源数量不大于系统掌握的剩余的空间资源与所有Pi(j<i)所占的资源之和.
2.不安全状态可能产生死锁.
目前状态 最大需求 尚需
P1 3 9 6
P2 5 10 5
P3 2 4 2
在每一次进程中申请的资源,判定一下,若实际分配的话,之后系统是否安全.
3.银行家算法的思路:
1),进程一开始向系统提出最大需求量.
2),进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.
3),若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的
剩余资源量,若不超出,则分配,否则等待.
4.银行家算法的数据结构.
1),系统剩余资源量A[n],其中A[n]表示第I类资源剩余量.
2),各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i
类资源最大需求.
3),已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量.
4),剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目.
5.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作:
1),判定E[n]是否大于D[j][n],若大于,表示出错.
2),判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待.
3),若以上两步没有问题,尝试分配,即各变量作调整.
4),按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待.
6."安全性检测"算法
1),先定义两个变量,用来表示推算过程的数据.
F[n]=A[n],表示推算过程中,系统中剩余资源量的变化.
J[n]=False表示推算过程中各进程是否假设"已完成"
2),流程:
在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True
(假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行.
若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.
算法的实现
一、初始化
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
二、银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。
(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
三、安全性检查算法
(1)设置两个工作向量Work=AVAILABLE;FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
GOTO 2
(4)如所有的进程Finish= true,则表示安全;否则系统不安全。
初始化算法流程图:
银行家算法流程图:
安全性算法流程图:
源程序清单
#include <iostream>
using namespace std;
#define MAXPROCESS 50 /*最大进程数*/
#define MAXRESOURCE 100 /*最大资源数*/
int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/
int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/
int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/
int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/
int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/
bool FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/
int p[MAXPROCESS]; /*记录序列*/
int m,n; /*m个进程,n个资源*/
void Init();
bool Safe();
void Bank();
int main()
{
Init();
Safe();
Bank();
}
void Init() /*初始化算法*/
{
int i,j;
cout<<"请输入进程的数目:";
cin>>m;
cout<<"请输入资源的种类:";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>MAX[i][j];
cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>ALLOCATION[i][j];
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
if(NEED[i][j]<0)
{
cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl;
j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:"<<endl;
for(i=0;i<n;i++)
{
cin>>AVAILABLE[i];
}
}
void Bank() /*银行家算法*/
{
int i,cusneed;
char again;
while(1)
{
cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<<endl;
cin>>cusneed;
cout<<"请输入进程所请求的各资源的数量"<<endl;
for(i=0;i<n;i++)
{
cin>>REQUEST[cusneed][i];
}
for(i=0;i<n;i++)
{
if(REQUEST[cusneed][i]>NEED[cusneed][i])
{
cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl;
continue;
}
if(REQUEST[cusneed][i]>AVAILABLE[i])
{
cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<<endl;
continue;
}
}
for(i=0;i<n;i++)
{
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
}
if(Safe())
{
cout<<"同意分配请求!"<<endl;
}
else
{
cout<<"您的请求被拒绝!"<<endl;
for(i=0;i<n;i++)
{
AVAILABLE[i]+=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];
NEED[cusneed][i]+=REQUEST[cusneed][i];
}
}
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;
cin>>again;
if(again=='y'||again=='Y')
{
continue;
}
break;
}
}
bool Safe() /*安全性算法*/
{
int i,j,k,l=0;
int Work[MAXRESOURCE]; /*工作数组*/
for(i=0;i<n;i++)
Work[i]=AVAILABLE[i];
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
for(i=0;i<m;i++)
{
if(FINISH[i]==true)
{
continue;
}
else
{
for(j=0;j<n;j++)
{
if(NEED[i][j]>Work[j])
{
break;
}
}
if(j==n)
{
FINISH[i]=true;
for(k=0;k<n;k++)
{
Work[k]+=ALLOCATION[i][k];
}
p[l++]=i;
i=-1;
}
else
{
continue;
}
}
if(l==m)
{
cout<<"系统是安全的"<<endl;
cout<<"安全序列:"<<endl;
for(i=0;i<l;i++)
{
cout<<p[i];
if(i!=l-1)
{
cout<<"-->";
}
}
cout<<""<<endl;
return true;
}
}
cout<<"系统是不安全的"<<endl;
return false;
分享到:
相关推荐
银行家算法流程图+C++源代码+实验报告-课程设计.doc
"银行家算法流程图.png"应详细描绘了从进程请求资源到系统决定是否分配并更新状态的整个过程。 总的来说,银行家算法是操作系统中的重要概念,通过合理的资源分配策略避免了死锁的发生。C和C++实现提供了代码层面的...
为了解决这个问题,银行家算法被引入,这是一种预防死锁的策略。本实验主要关注的就是银行家算法的实现,它在安徽大学的操作系统课程中作为实验项目进行,使用C语言编写,并在Visual Studio 2008环境下编译和调试...
二、银行家算法流程 1. 请求检查:当进程提出资源请求时,首先检查请求是否在当前需求范围内,即REQUEST ≤ NEED。如果请求超出需求,系统会报错。 2. 可用性检查:接着,验证请求是否小于当前可用资源,即REQUEST...
在提供的压缩包中,`银行家算法.cpp`应是C++语言实现的源代码,它可能包含了上述算法的逻辑。`银行家算法.doc`可能是实验报告,详细解释了算法的运行过程、结果分析以及可能遇到的问题。而`银行家算法.exe`则是编译...
银行家算法是操作系统中用于避免死锁的一种策略,由艾兹格·迪杰斯特拉提出。这个算法的主要目的是确保系统资源的分配不会导致系统进入不安全状态,即系统能够保证在有限的时间内完成所有进程。在银行家算法中,我们...
银行家算法避免死锁 VM软件 Linux系统 C语言 成功编译 成功运行 内附完整课设报告,代码,运行cpp 附有哲学家进餐简略一题 原课设要求:死锁避免 (1)请设计一个程序演示死锁避免算法(银行家算法)。 (2)要求该...
银行家算法PPT学习教案 ...银行家算法PPT学习教案涵盖了银行家算法的定义、实验目的、实验要求、数据结构、原理、安全性算法、实例、流程图和源代码等多个方面,为学生提供了一个系统的银行家算法学习平台。
2. 算法流程图:银行家算法的流程图包括进程集合、可利用资源向量、最大需求矩阵、分配矩阵、需求矩阵等。 3. 数据结构的说明:银行家算法中使用的数据结构包括可利用资源向量AVAILABLE、最大需求矩阵MAX、分配矩阵...
### 银行家算法C语言代码解析与详解 #### 实验名称 银行家算法 #### 实验目的 深入理解银行家算法如何有效地避免系统发生死锁现象。 #### 设计思想 银行家算法的核心思想是在资源分配之前进行安全性检查。在资源...
在本项目中,我们有一个简单的图形用户界面(GUI)来模拟银行家算法的工作流程,它使用Java Swing库构建。 首先,我们要理解银行家算法的核心思想。在银行家算法中,系统维护着一个资源的最大需求矩阵(Max)、当前...
### 操作系统课程设计——银行家算法 #### 1. 序言 银行家算法是由Edsger Dijkstra于1965年提出的,旨在通过一种动态的方式避免系统中的死锁问题。该算法的核心思想是确保系统在分配资源时始终处于安全状态,即...
在程序设计中,学生需要使用 C 语言编程,实现银行家算法的逻辑 流程图如下: 开始 → 输入资源数、各类资源数、初始化输入进程数 ni → 输入进程的 i 的最大需求向量 → 初始化系统资源 → → 申请资源 → 如果...
- 使用这些库可以方便地构建交互式的用户界面,并与银行家算法的逻辑代码进行交互。 5. 示例代码结构: - 创建一个Banker类来实现银行家算法的核心逻辑。 - 创建一个GUI类,负责界面布局和事件处理,与Banker类...
#### 五、算法流程图 (由于文本格式限制,此处省略流程图) #### 六、实现代码 实验使用C++编写了模拟银行家算法的程序。下面是对部分代码的解读: ```cpp // 定义资源种类数和进程数 #define N 3 #define M 5 ...
### 银行家算法C++实现解析 #### 核心概念 银行家算法是操作系统中用于避免死锁的一种资源分配策略。它通过系统维护一个全局的安全状态来判断是否可以安全地分配资源请求,从而避免进入不安全状态,进而防止死锁的...
操作系统实验主要涵盖四个核心主题:进程调度、存储管理、磁盘调度和银行家算法,以及文件系统设计。这里我们将详细探讨这些概念。 1. **进程调度**:在多道程序设计环境中,进程调度是操作系统核心功能之一,它...
【银行家算法】是操作系统中用于预防死锁的一种策略,由艾兹格·迪杰斯特拉提出。在银行家算法中,系统模拟银行贷款的过程来管理资源,确保系统始终能够避免死锁的发生。该算法的核心思想是预先分配资源,但不超过...
1. **算法流程图**:绘制银行家算法的流程图,以便清晰地理解算法的执行步骤。 2. **算法数据结构**:定义用于算法实现的数据结构,包括: - **可利用资源向量** `Available`:表示系统中当前可用的各种资源数量。 ...