操作系统——银行家算法

银行家算法


一种解决死锁的方案


基本思想:

计算机银行
系统资源贷款
申请资源的进程借款人
操作系统银行家

模拟银行贷款,银行家不可能满足所有借款人所要求的借款总额,所以当某借款人提出借款时,银行家必须判断如果将款借出,会不会导致资金周转不灵。若会,则不借;否则,就借。


算法过程:

对每一个资源申请进行检查,看如果满足该申请是否会导致不安全状态。若是则不满足该申请,否则满足。


单项资源的银行家算法:

系统状态如下表:


进程名已有数目最大需求尚需数目
a143
b253
c165
d275
剩余资源4

观察表可得,此时系统剩余资源为4,而a、b尚需资源为3,可以满足,所以就可以先分配给a,待a进程执行完成后回收资源,剩余资源就会变为5。

如果一开始把剩余资源分给c或者d,c和d获得资源并没有满足它们的最大需求,所以就不会执行完成释放资源,此时所有进程都无法执行下去,剩余资源为0(状态不安全),陷入了死锁的局面。

银行放贷——>借款人收到钱后完成项目——>借款人还贷并附带利息——>银行用收到的利息和贷款继续放贷良性循环


多项资源的银行家算法:
  1. 准备工作

    • 设置资源的已分配矩阵R
    • 设置尚需资源分配矩阵Q
    • 设置可分配资源向量available
  2. 此时某进程对某一种资源提出申请,假定预先分配给它

  3. 修改1中的信息(矩阵和向量)

  4. 在矩阵Q中找到一行,使该行向量小于等于available

    • 若不存在——说明没有进程能够获得全部资源运行到完成
  5. 假设被选中的那一行的进程获得资源并运行结束,将它占有的资源全部加入向量available

    • 满足尚需资源矩阵的一行之后,将已分配矩阵对应的行加入到available向量
  6. 重复4、5,直到所有进程都完成,则系统是安全的,可以分配;或者发生死锁,则预先分配是不安全的,应不予分配


例:假设有四类资源R1、R2、R3、R4;五个进程a、b、c、d、e;
已分配矩阵尚需资源矩阵
在这里插入图片描述在这里插入图片描述
最大需求矩阵available向量
在这里插入图片描述(2,2,1,2)
  1. 对比available向量和尚需资源矩阵,available向量目前只能满足c进程;
  2. 满足c进程之后,c行在尚需资源矩阵Q里变为0,available向量变为(2,2+3,4+1,2)=(2,5,5,2);
  3. 可以满足进程a或e,进而满足b或d,直到全部结束;

### 银行家算法示例题目及解答 #### 示例场景描述 考虑一个系统中有五个进程 \( P_0 \),\( P_1 \),\( P_2 \),\( P_3 \),\( P_4 \) 和三种类型的资源 R1, R2, R3。当前系统的状态如下: | Process | Max | Allocation | Need | |---------|--------|------------|----------| | \( P_0 \)| 7 5 3 | 0 1 0 | 7 4 3 | | \( P_1 \)| 3 2 2 | 2 0 0 | 1 2 2 | | \( P_2 \)| 9 0 2 | 3 0 2 | 6 0 0 | | \( P_3 \)| 2 2 2 | 2 1 1 | 0 1 1 | | \( P_4 \)| 4 3 3 | 0 0 2 | 4 3 1 | 当前可用的资源数量为 Available = (3, 3, 2). #### 安全序列检测过程 为了判断该状态下是否存在安全序列,按照银行家算法进行安全性检查。 1. 初始化工作列表 Work 设置为 Available 的初始值 (3, 3, 2). 2. 创建 Finish 数组用于记录每个进程的状态,默认全部设置为 false. 3. 寻找满足条件 `Need[i] <= Work` 并且尚未完成 (`Finish[i]=false`) 的进程 i. 对于上述表格中的数据: - **第一次迭代** - 检查所有进程的需求是否小于等于 Work 值。 - 发现 \( P_1 \)'s Need(1, 2, 2) 小于等于 Work(3, 3, 2)[^2]. - 更新 Work += Allocation of \( P_1 \)=Work+(2, 0, 0)=(5, 3, 2). - 标记 \( P_1 \) 已经完成(Finish\[1\]=true). - **第二次迭代** - 继续寻找符合条件的新进程... - 找到 \( P_3 \)'s Need(0, 1, 1)<=Work(5, 3, 2). - 更新 Work+=Allocation of \( P_3 \)=Work+(2, 1, 1)=(7, 4, 3). - 标记 \( P_3 \) 已经完成(Finish\[3\]=true). 重复此操作直到找到完整的安全序列或者无法再找到任何可运行的进程为止。最终得到的安全序列为 `<P1,P3,...>` (具体取决于后续几步的结果)。如果能够成功构建这样一个序列,则说明此时处于安全状态;反之则表示存在潜在死锁风险[^4]. ```python def banker_algorithm(max_resources, allocated_resources, available_resources): need_matrix = [[max_res - alloc for max_res, alloc in zip(max_row, alloc_row)] for max_row, alloc_row in zip(max_resources, allocated_resources)] n_processes = len(max_resources) finish = [False] * n_processes work = list(available_resources) safe_sequence = [] while False in finish: found = False for i in range(n_processes): if not finish[i] and all([need <= w for need, w in zip(need_matrix[i], work)]): work = [w + a for w, a in zip(work, allocated_resources[i])] finish[i] = True safe_sequence.append(f"P{i}") found = True if not found: break return "Safe Sequence:" + ", ".join(safe_sequence) if all(finish) else "No Safe Sequence Found" # Example usage with given data points print(banker_algorithm( [(7, 5, 3), (3, 2, 2), (9, 0, 2), (2, 2, 2), (4, 3, 3)], [(0, 1, 0), (2, 0, 0), (3, 0, 2), (2, 1, 1), (0, 0, 2)], (3, 3, 2))) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OutlierLi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值