死锁避免算法--银行家算法

银行家算法

算法思想

银行家算法:银行家算法是从当前状态出发,按照系统各类资源剩余量逐个检查各进程需要申请的资源量,找到一个各类资源申请量均小于等于系统剩余资源量的进程P1。然后分配给该P1进程所请求的资源,假定P1完成工作后归还其占有的所有资源,更新系统剩余资源状态并且移除进程列表中的P1,进而检查下一个能完成工作的客户,......。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。若找不到这样的安全序列,则当前状态不安全。

相关数据结构

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

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

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

  4. 需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成任务。

    上述三个矩阵间存在下述关系:Need[i,j]=Max[i,j]-Allocation[i,j]

例子

 

银行家算法实例


当前系统状态
从图中数据我们可以利用银行家算法的四个数据结构,来描述当前的系统状态:


因为系统总资源R=(17,5,20),所以可以计算出可利用资源向量Available=R-Allocation(P1,P2,P3,P4,P5)=(2,3,3)
分配资源
根据目前状态,用Available向量每一个进程的Need向量相比,发现Available>=P5.Need,所以可以将目前的资源分配给P5向量(P4也可以,不唯一)。当P5获得所需的所有向量后执行完毕,之后释放其占有的所有资源。此时更新系统资源:


Available=R-Allocation(P1,P2,P3)=(7,4,11)
按照上述同样的方法,P4 也可以安全运行,以及P3,P2,P1也能按顺序运行。因此,在T0时刻,存在安全序列:P5,P4,P3,P2,P1(并不唯一)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是一种避免死锁算法,最初是为银行系统计的,以确保银行在发放现金贷款时不会发生不能满足所有客户需要的情况。该算法可以应用于任何资源分配系统,包括操作系统、数据库管理系统等。 银行家算法的基本思想是,系统在分配资源之前,先检查该分配是否会导致系统进入不安全状态,如果不会,就分配资源;否则,就等待。系统通过维护每个进程的最大需求、已分配资源和需要资源来实现这一点。当一个进程请求资源时,系统会检查该请求是否会导致系统进入不安全状态,如果不会,就分配资源;否则,就等待。 以下是银行家算法的基本步骤: 1. 初始化:对于每个进程计算它的最大需求、已分配资源和需要资源。 2. 安全性检查:检查系统是否处于安全状态。如果是,就分配资源;否则,就等待。 3. 资源分配:如果资源可用,就分配资源;否则,就等待。 4. 进程释放资源:当一个进程释放资源时,系统会重新计算每个进程的最大需求、已分配资源和需要资源,并重新进行安全性检查。 以下是一个简单的C++代码示例,演示了银行家算法的实现: ```cpp #include <iostream> using namespace std; const int P = 5; // 进程数 const int R = 3; // 资源数 int available[R] = {3, 3, 2}; // 可用资源 int maxm[P][R] = {{7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3}}; // 最大需求 int allocation[P][R] = {{0, 1, 0}, {2, 0, 0}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2}}; // 已分配资源 int need[P][R]; // 需要资源 bool isSafe() { int work[R]; bool finish[P] = {false}; for (int i = 0; i < R; i++) { work[i] = available[i]; } int count = 0; while (count < P) { bool found = false; for (int i = 0; i < P; i++) { if (!finish[i]) { bool flag = true; for (int j = 0; j < R; j++) { if (need[i][j] > work[j]) { flag = false; break; } } if (flag) { for (int j = 0; j < R; j++) { work[j] += allocation[i][j]; } finish[i] = true; found = true; count++; } } } if (!found) { return false; } } return true; } int main() { for (int i = 0; i < P; i++) { for (int j = 0; j < R; j++) { need[i][j] = maxm[i][j] - allocation[i][j]; } } if (isSafe()) { cout << "Safe state" << endl; } else { cout << "Unsafe state" << endl; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值