在C语言中使用银行家算法预防死锁
银行家算法是一种资源分配和避免死锁的算法,在执行 “s-state “检查以寻找潜在活动并确定是否应允许继续分配之前,模拟所有资源的预定最大可能量的资源分配。
为什么银行家的算法被称为
银行家的算法之所以有这样的标题,是因为它被运用于银行业,以确定是否授权向个人提供贷款。假设一家银行有n个账户持有人,每个人的个人余额为S。当有人要求贷款时,银行首先从其拥有的资金总额中扣除贷款金额,只有当余额超过S时才会批准贷款。之所以这样做,是因为如果每个账户持有人都来取钱,银行就能简单地做到。换句话说,银行绝不会以妨碍其满足所有客户要求的方式安排其资金。银行会努力在任何时候都保持安全。
银行家的算法是用以下数据结构实现的。
设n为系统中进程的数量,m为资源种类的数量。
可用的。
- 这个大小为’m’的1-d数组列出了当前可用的每一类资源的数量。
- 如果Available[j] = Rj,则有’k’个资源类型的实例。
最大。
- 系统中每个进程的最大需求由一个大小为’n*m’的二维数组指定。
- 如果Max[i, j] = k,则进程Pi最多可以请求’k’个资源类型Rj的实例。
分配。
- 当前分配给每个进程的每种资源的数量由一个大小为’n*m’的二维数组指定。
- 进程由Allocation[i, j] = k表示,Pi此时已经获得了’k’个资源类型的实例。Rj
需要。
- 每个进程的剩余资源需求显示在一个大小为’n*m’的二维数组中。
- 进程用Need[i, j] = k表示。现在,Pi需要 “k “个资源类型的实例。Rj
- Allocation[i, j] – Maximum[i, j] = Need[i, j)
现在分配给进程Pi的资源由Allocationi标识,而进程Pi为了完成工作可能还需要的额外资源则由Needi标识。
安全算法和资源请求算法构成了银行家的算法。
安全的算法
以下是对确定系统是否处于安全状态的方法的描述。
资源请求的算法
让Requesti代表进程Pi的请求阵列。进程Pi请求K个资源类型Rj的实例,用Requesti [j] = k表示。当进程Pi提出资源请求时,会发生以下事情。
以下是银行家的算法的执行情况
输出
解释。
- 进程在进入系统时必须预测所需资源的最大数量,这可能在合理的时间内完成。
- 与交互式系统相比,这种方法保持了固定数量的进程。
- 必须有特定数量的资源可供分配,才能使这种技术发挥作用。如果一个小工具坏了,意外下线,该算法将无法运作。
- 该方法将产生开销成本,因为当有几个进程和资源时,必须为每个进程调用该方法。