ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 Python 实现银行家算法模拟进程资源分配并判断系统安全状态

如何用 Python 实现银行家算法模拟进程资源分配并判断系统安全状态 如何用 Python 实现银行家算法模拟进程资源分配并判断系统安全状态【免费下载链接】PythonAll Algorithms implemented in Python项目地址: https://gitcode.com/GitHub_Trending/pyt/Python如果你需要模拟一组进程对多种资源如内存、接口、信号量的占用情况并判断系统在给定最大需求下是否处于安全状态可以直接使用 TheAlgorithms Python 仓库中的 other/bankers_algorithm.py。这个文件实现了 Dijkstra 的银行家算法给定系统资源总量、各进程当前持有量、各进程最大需求算法通过逐步让进程执行完毕并释放资源来检验是否存在一个可行的执行顺序全部进程都能完成则系统处于安全状态s-state否则输出不安全状态并中止。运行只需 Python 和 NumPy下文给出从准备环境到换入自有数据、再到用 doctest 验证的完整路径。准备运行环境bankers_algorithm.py第 21 行import numpy as np可用资源、需求矩阵的减法都基于 NumPy 数组运算因此必须先安装 NumPy。项目 pyproject.toml 将numpy2.1.3列为依赖并声明requires-python 3.14这是整个项目的解释器要求本文件用到的语法本身较基础。在本地环境中安装 NumPypython3 -m pip install numpy三个输入表及它们的维度BankersAlgorithm的构造函数接收三个参数见 other/bankers_algorithm.py 第 41–57 行填写数据前先弄清各自含义与维度参数文档说明维度claim_vector系统中每种资源的总量如内存、接口、信号量等资源的可用数量长度 资源种类数allocated_resources_table每个进程当前已持有的各类资源数量进程数 × 资源种类数maximum_claim_table各进程对各类资源的最大需求docstring 中表述为系统当前拥有的各类资源量实际参与need计算的是最大需求进程数 × 资源种类数代码内部的推导关系来自__available_resources与__need两个方法可用资源available claim_vector − 各进程持有量按列求和每个进程的需求need[i][j] max_claim[i][j] − alloc_table[i][j]安全检查条件即max_claim[i][j] - alloc_table[i][j] avail[j]见__need的 docstring。因此两张表的行数必须一致且等于进程数列数必须等于claim_vector的长度。运行内置示例并读输出文件自带一组测试数据5 个进程、4 种资源test_claim_vector [8, 5, 9, 7] test_allocated_res_table [ [2, 0, 1, 1], [0, 1, 2, 1], [4, 0, 0, 3], [0, 2, 1, 0], [1, 0, 3, 0], ] test_maximum_claim_table [ [3, 2, 1, 4], [0, 2, 5, 2], [5, 1, 0, 5], [1, 5, 3, 0], [3, 0, 3, 3], ]直接运行文件只会执行 doctest文件末尾是doctest.testmod()看不到模拟过程的完整输出。要看完整模拟在仓库根目录执行下面这条单行命令other/目录下有__init__.py可作为包导入python3 -c from other.bankers_algorithm import BankersAlgorithm, test_claim_vector, test_allocated_res_table, test_maximum_claim_table; BankersAlgorithm(test_claim_vector, test_allocated_res_table, test_maximum_claim_table).main(describeTrue)main(describeTrue)会先打印两张表的排版数据describeTrue触发表格展示然后进入逐进程模拟。文档示例即该文件 doctest 中固定的期望输出数据集固定时输出可复现Allocated Resource Table P1 2 0 1 1 P2 0 1 2 1 P3 4 0 0 3 P4 0 2 1 0 P5 1 0 3 0 System Resource Table P1 3 2 1 4 P2 0 2 5 2 P3 5 1 0 5 P4 1 5 3 0 P5 3 0 3 3 Current Usage by Active Processes: 8 5 9 7 Initial Available Resources: 1 2 2 2 __________________________________________________ Process 3 is executing. Updated available resource stack for processes: 5 2 2 5 The process is in a safe state. Process 1 is executing. Updated available resource stack for processes: 7 2 3 6 The process is in a safe state. Process 2 is executing. Updated available resource stack for processes: 7 3 5 7 The process is in a safe state. Process 4 is executing. Updated available resource stack for processes: 7 5 6 7 The process is in a safe state. Process 5 is executing. Updated available resource stack for processes: 8 5 9 7 The process is in a safe state.注意Current Usage by Active Processes: 8 5 9 7一行打印的是claim_vector资源总量Initial Available Resources: 1 2 2 2才是算法实际用来逐步分配的初始可用量即总量减去各进程已持有量的按列和。如何判定安全状态main的模拟循环第 165–195 行逻辑是遍历尚未完成的进程需求need_list取第一个满足need available逐资源比较的进程该进程执行完毕把它持有的alloc一行加回可用资源栈打印Updated available resource stack for processes: ...本轮找到过可执行进程则打印The process is in a safe state.若一整轮没有任何进程能继续则打印System in unsafe state. Aborting...并退出循环。所以判定就看最终输出逐进程走完且全部出现The process is in a safe state.如示例中 Process 3 → 1 → 2 → 4 → 5 的顺序说明系统安全出现System in unsafe state. Aborting...说明当前分配状态下不存在可行的执行顺序系统处于不安全状态。main返回None结论完全由这些打印给出。换入自己的进程与资源数据把三个数组替换成自己的数据即可结构保持资源向量 两张进程×资源表from other.bankers_algorithm import BankersAlgorithm claim_vector [8, 5, 9, 7] # 每种资源的总量长度即资源种类数 allocated [ [2, 0, 1, 1], [0, 1, 2, 1], [4, 0, 0, 3], [0, 2, 1, 0], [1, 0, 3, 0], ] # 每行一个进程当前持有的资源行数即进程数 maximum_claim [ [3, 2, 1, 4], [0, 2, 5, 2], [5, 1, 0, 5], [1, 5, 3, 0], [3, 0, 3, 3], ] # 每行一个进程对资源的最大需求维度须与 allocated 相同 BankersAlgorithm(claim_vector, allocated, maximum_claim).main(describeTrue)上例数值就是文件内置数据替换为你自己的值后用同一套输出判断方法读取结果。若两张表行数不一致或列数与claim_vector长度不符数组减法会报 NumPy 维度错误这属于输入构造错误而非算法结果。用 doctest 验证结果文件内main与_BankersAlgorithm__need_index_manager的 docstring 中带有 doctest是核对实现是否按预期输出最直接的方式。CONTRIBUTING.md 给出的本地 doctest 运行方式python3 -m doctest -v other/bankers_algorithm.py或者直接运行文件本身末尾doctest.testmod()会执行同一组 doctestpython3 other/bankers_algorithm.pydoctest 全部通过时不会有失败报告若某个用例的输出与 docstring 中记录的不一致会打印失败详情。这组 doctest 同时覆盖了需求索引字典{0: [1, 2, 0, 3], 1: [0, 1, 3, 1], 2: [1, 1, 0, 2], 3: [1, 3, 2, 0], 4: [2, 0, 0, 3]}和完整模拟输出可以作为回归检查。边界与限制该实现按 docstring 的表述是模拟预定最大可能量的资源分配后做 s-state 检查即基于各进程的最大需求表做一次性安全性判定不提供运行中动态资源请求的接口。main只打印不返回值返回None程序化判断安全状态时只能解析打印文本或自行改写返回值。依赖 NumPy缺少该库时import阶段即失败属环境未就绪而非数据问题。项目目录导航中该文件登记为 Bankers Algorithm见 DIRECTORY.md如需参考同类资源管理类实现可在other/目录下浏览。【免费下载链接】PythonAll Algorithms implemented in Python项目地址: https://gitcode.com/GitHub_Trending/pyt/Python创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表