避免死锁之——银行家算法

一 概述

银行家算法是最具有代表性的避免死锁的算法,原本运用于银行系统,以确保银行在发放现金贷款时,不会发生不能满足用户需求的情况。

为了实现银行家算法,每一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。

二 银行家算法所需的数据结构

银行家算法中必须设置的四个数据结构:系统中的可利用资源,所有进程对资源的最大需求,系统中的资源分配,以及所有进程还需要多少资源的情况。

可利用资源向量Available:这是一个含有m个元素的数组,其中的每个元素代表一类可利用的资源数目。其初始值为系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j] = K,则表示系统中现有的Rj类资源为K个。

最大需求矩阵Max:这是一个n*m的矩阵,它定义了系统中n个进程中的每个进程对m类可利用资源的最大需求。如果Max[i,j] = K,则表示进程i需要Rj类资源的最大数目为K。

分配矩阵Allocation:这是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j] = K,则表示进程i当前已经分得Rj类资源的数目为K。

需求矩阵Need:同样为一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j] = K,则表示进程i还需要Rj类资源数为K才能够完成其任务。

                                                       Need[i,j] = Max[i,j] - Allocation[i,j]

三 银行家算法

设Request为进程i的请求向量,如果Request[j]=K,表示进程i需要K个Rj类型的资源。当进程i发出资源请求之后,系统需要进行下述步骤进行检查:

  1. 如果Request[j]<=Need[i,j],便转向步骤2,否则认为出错,因为它所需的资源数已经超过它所宣布的最大值。
  2. 如果Request[j]<=Available[j],便转向步骤3,否则表示尚无足够资源,i进程须等待。
  3. 系统试探着把资源分配给进程i,并对资源数根据分配情况动态进行更改。

          Available[j] = Avaiable[j] - Request[i,j];

          Allocation[i,j] = Allocation[i,j] + Request[j];

          Need[i,j] = Need[i,j] - Request[j]。

系统执行的安全性检查:检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程i,并结束资源分配任务;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程i进行等待。

四 银行家算法的实现

待续

参考资料:计算机操作系统第四版 汤小丹,梁红兵,哲凤屏,汤子瀛编著

银行家算法是一种经典的避免死锁算法,它可以确保系统在分配资源时不会进入死锁状态。该算法主要分为两个过程:安全性检查和资源分配。 安全性检查: 在系统运行时,银行家算法需要进行安全性检查,以确定当前状态是否安全。安全状态指的是系统可以满足所有进程资源需求,而不会陷入死锁状态。 实现该算法需要维护以下数据结构: - Available:表示系统中可用的资源数目。 - Allocation:表示已经分配给各个进程资源数目。 - Need:表示每个进程还需要的资源数目。 具体实现过程如下: 1. 初始化工作: 首先,需要计算出每个进程的所需资源数目,即 Need 数。这可以通过计算 Max - Allocation 来得到,其中 Max 表示进程所需的最大资源数目。 2. 安全性检查: 银行家算法的安全性检查基于两个概念:安全序列和安全状态。 安全序列:指的是一系列进程的执行顺序,这些进程都能够完成任务,不会进入死锁状态。 安全状态:指的是系统可以分配资源,使得所有进程都能够完成任务,不会进入死锁状态。 安全性检查的具体实现过程如下: (1)初始化工作: 设置 Work 数Available的值;Finish 数的值都为 false。 (2)循环检查: 循环检查所有进程,找到一个满足以下条件的进程: - Finish[i] = false - Need[i] <= Work 如果找到了这样的进程,则将该进程资源释放,并将它加入安全序列中。同时,更新 Work 数的值。 如果没有找到这样的进程,则说明系统无法满足所有进程资源需求,进入死锁状态。 3. 资源分配: 如果系统处于安全状态,则可以进行资源分配。资源分配的过程需要按照以下规则进行: - 判断是否能够满足当前进程资源需求(即 Need[i] <= Available)。 - 如果可以满足,则将资源分配给该进程,同时更新 Available 和 Allocation 数的值。 - 如果无法满足,则该进程必须等待资源。 需要注意的是,资源分配过程中,需要检查是否会破坏系统的安全状态。如果分配资源后,系统无法保持安全状态,则应该撤销分配操作,等待系统恢复到安全状态后再进行分配。 综上所述,银行家算法是一种非常重要的避免死锁算法。通过合理地分配系统资源,可以避免系统陷入死锁状态,提高系统的可靠性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值