-
概述:
- 银行家算法是操作系统领域中用于避免死锁的经典算法
- 其核心思想是通过模拟资源分配的过程,系统在进行资源分配之前,应先计算此次分分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待
- 实现银行家算法,系统必须设置若干数据结构
-
死锁(Deadlock):
- 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
- 称此时系统处于死锁状态或系统产生了死锁
- 称这些永远在互相等待的进程成为死进程
-
资源与进程:
- 在操作系统中,资源是有限的,而多个进程会竞争这些资源
- 银行家算法通过以下关键数据结构来描述资源分配的状态:
- 资源向量(Available):表示系统中当前可用的每种资源的数量
- 最大需求矩阵(Max):记录每个进程对每种资源的最大需求量
- 分配矩阵(Allocation):表示当前已分配给每个进程的资源数量
- 需求矩阵(Need):表示每个进程还需要的资源数量,计算公式为:Need = Max - Allocation
-
安全状态:
- 银行家算法的核心目标是确保系统始终处于 "安全状态"
- 所谓安全状态,是指在一种资源分配顺序,使得所有进程都能顺利完成,而不会导致死锁
- 系统需要满足以下条件:
- 每个进程的资源请求不超过其最大需求
- 系统能够找到一个安全序列,使得每个进程都能获得所需资源并完成执行
-
不安全状态:
- 不存在一个安全序列。不安全状态不一定导致死锁
-
工作流程:
-
初始化:
- 在算法开始前,需要初始化以下数据结构:
- Need:每个进程还需要的资源数量
- Allocation:当前已分配给每个进程的资源数量
- Max:每个进程的最大资源需求
- Available:系统当前可用的资源数量
- 在算法开始前,需要初始化以下数据结构:
-
资源请求处理:
-
当一个进程请求资源时,系统会执行以下步骤:
- 检查请求合法性:如果请求的资源数量超过进程的最大进程需求,请求将被拒绝
- 检查资源可用性:如果请求的资源数量超过系统当前可用资源,进程需要等待
- 试探性分配:假设分配资源,并跟新 Available、Allocation 和 Need 矩阵
- 安全性检查:检查系统是否仍处于安全状态
- 如果是,则正式分配资源
- 否则,撤销试探性分配
-
-
安全性检查:
- 安全性检查是银行家算法的核心步骤,其目的是找到一个安全序列,步骤如下:
- 初始化工作项量 Work 和完成标志 Finish
- 查找一个未完成的进程,其资源需求小于等于 Work
- 如果找到这样的进程,假设其可以完成,并释放其占用的资源
- 重复上述步骤,直到所有进程都完成或无法找到满足条件的进程
- 安全性检查是银行家算法的核心步骤,其目的是找到一个安全序列,步骤如下:
-
-
实现银行家算法:
-
定义全局变量:
private static
-