Python实现银行家算法(使用numpy)

银行家算法

这里把数据都写死了
使用的是西安电子科技大学出版社的计算机操作系统(第四版)第113页的表格的数据

# 银行家算法

import numpy as np


def bank(n, m) -> bool:
    # 可利用资源向量,是一个含有m个元素的数组,代表系统中可利用资源的数目
    Available = np.array([3, 3, 2], dtype=np.int32)
    # 最大需求矩阵Max,是一个n×m的矩阵,定义系统中n个进程中的每一个进程对m类资源的最大需求
    Max = np.array([7, 5, 3, 3, 2, 2, 9, 0, 2, 2, 2, 2, 4, 3
  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
银行家算法是一种避免死锁的算法,它通过检查系统资源的当前状态来判断是否能够满足进程的资源请求,从而避免进程陷入死锁状态。在该算法中,需要维护一个资源分配矩阵和一个需求矩阵,其中资源分配矩阵记录当前系统中各个进程已分配的资源,需求矩阵则记录各个进程还需要的资源。 下面是一个简单的 Python 实现银行家算法的例子: ```python import numpy as np def banker_algorithm(available, max_need, allocation): """ 银行家算法 :param available: 一维数组,表示系统中可用的各类资源数量 :param max_need: 二维数组,表示各个进程最多需要的各类资源数量 :param allocation: 二维数组,表示各个进程已分配的各类资源数量 :return: 若当前状态安全,则返回 True;否则返回 False """ # 计算需求矩阵 need = max_need - allocation # 初始化工作向量 work = available.copy() # 初始化 finish 数组 num_processes = len(max_need) finish = np.zeros(num_processes, dtype=bool) # 迭代直到所有进程都完成 while True: # 找到一个未完成的进程 i,使得它的需求矩阵小于等于当前可用资源 i = np.argwhere((~finish) & np.all(need <= work, axis=1)) if len(i) == 0: break i = i[0][0] # 将进程 i 占用的资源释放,并将其加入到工作向量中 work += allocation[i] finish[i] = True # 如果所有进程都完成了,则说明当前状态是安全的 return np.all(finish) ``` 这个算法接受三个参数:`available`、`max_need` 和 `allocation`,分别表示系统中可用的各类资源数量、各个进程最多需要的各类资源数量和各个进程已分配的各类资源数量。它会计算出需求矩阵,并迭代直到所有进程都完成。如果所有进程都完成了,则说明当前状态是安全的,返回 True;否则返回 False。 下面是一个简单的测试: ```python available = np.array([3, 3, 2]) max_need = np.array([[7, 5, 3], [3, 2, 2], [9, 0, 2], [2, 2, 2], [4, 3, 3]]) allocation = np.array([[0, 1, 0], [2, 0, 0], [3, 0, 2], [2, 1, 1], [0, 0, 2]]) if banker_algorithm(available, max_need, allocation): print("当前状态是安全的") else: print("当前状态不是安全的") ``` 在这个测试中,系统中有 3 个 A 类资源、3 个 B 类资源和 2 个 C 类资源。我们有 5 个进程,它们的最大需求矩阵、分配矩阵和需求矩阵如下: ``` Max Need Allocation Need P0 7 5 3 0 1 0 7 4 3 P1 3 2 2 2 0 0 1 2 2 P2 9 0 2 3 0 2 6 0 0 P3 2 2 2 2 1 1 0 1 1 P4 4 3 3 0 0 2 4 3 1 ``` 这个测试会输出 "当前状态是安全的",说明当前状态是安全的,没有死锁。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值