【操作系统】python实现银行家算法

news2024/11/26 23:35:17

银行家算法是最具有代表性的避免死锁的算法。

1、算法原理

银行家算法:当一个新进程进入系统时,该进程必须申明在运行过程中所需要的每种资源的最大数目,且该数目不能超过系统拥有的资源总量。当进程请求某组资源时,系统必须先确定系统中是否有足够的该类资源供以分配给该进程。若有,通过安全性算法来计算,将资源分配给该进程后,是否会使系统处于不安全状态,如果不会处于安全状态,则将资源分配给该进程,否则让进程等待。若没有,进程等待。

2、数据结构

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

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

分配矩阵 Allocation ,这是一个 n×m 的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation[i,j]=k,表示进程 i 当前已经分到 Rj 类资源的数目为 k。Allocation[i] 表示进程 i 的分配向量,有矩阵 Allocation 的第 i 行构成。

需求矩阵 Need ,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need[i,j]=k,表示进程 i 还需要 Rj 类资源 k 个,才能完成其任务。Need[i] 表示进程 i 的需求向量,由矩阵 Need 的第 i 行构成。

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

3、银行家算法

设 Request 是进程Pi的请求向量,如果 Requesti[j] = K,表示进程 Pi 需要 K 个 Rj 类型的资源。当 Pi 发出资源请求后,系统按下述步骤进行检査:

①如果 Requesti[j] ≤ Need[i,j]便转向步骤 2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
②如果 Requesti[j] ≤ Available[j],便转向步骤 3;否则,表示尚无足够资源,Pi须等待。
③系统试探着把资源分配给进程 Pi,并修改下面数据结构中的数值

Available[j] = Available[j] - Requesti[j]; // 分配出去
Allocation[i,j] = Allocation[i,j] + Requesti[j]; // 获得资源
Need[i,j] = Need[i,j] - Requesti[j];    // 需求减少

④系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程 Pi ,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程 Pi 等待。

4、安全性算法

①设置两个向量:① 工作向量 Work ,它表示系统可提供给进程继续运行所需的各类资源数目,它含有 m 个元素,在执行安全算法开始时,Work = Available;② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。默认全部为 False。
②从进程集合中找到一个能满足下述条件的进程

Finish[i] = False;
Need[i] ≤ Work; (向量比较)

若找到,执行步骤 3,否则,执行步骤 4 ;
③当进程 Pi 获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work = Work + Allocation[i] (向量运算)
Finish[i] = True;
转到步骤 2

④如果所有进程的 Finish[i] = True都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

5、实现代码

1. 函数security(work, need, allocation):

  • 该函数用于检查系统在给定资源情况下是否可以满足所有进程的需求并避免死锁。
  • 参数包括当前可用资源work、每个进程还需要的资源need以及已分配给每个进程的资源allocation。
  • 通过循环遍历进程,并找到可以完成的进程,直到所有进程都完成或无法分配资源为止。

2. 函数printTable(available, max_table, allocation, need):

  • 该函数用于打印进程的最大需求矩阵、分配矩阵以及还需要的资源矩阵。
  • 参数包括当前剩余资源available、每个进程的最大需求矩阵max_table、分配矩阵allocation和还需要的资源矩阵need。

3. 主函数main():

  • 要求用户输入资源种类数量m和各类资源的数量available。
  • 用户输入进程数量n,以及每个进程的最大需求矩阵和分配矩阵。
  • 计算每个进程还需要的资源矩阵need,以及当前剩余资源available。
  • 循环进行用户输入请求的过程,用户可以输入请求的进程索引和需求数组。
  • 根据用户输入的请求,判断请求是否合法,并根据安全性算法进行分配判断。如果分配后系统处于安全状态,则重新输出进程信息;否则提示不安全,撤销分配操作。
  • 主函数通过调用security()函数来检查安全性,然后打印当前进程的资源分配情况。
4. Numpy

由于机器学习算法在数据处理过程中大都涉及线性代数的知识,需要用到矩阵操作,Python本身没有处理矩阵的数据类型,因此需要使用附加的函数库numpy

import numpy as np

def printt(available, max_table, allocation, need):
    print("进程\tMax\tAllocation\tNeed")
    for i in range(5):
        print("P{}\t{}\t{}\t{}".format(i, max_table[i], allocation[i], need[i]))
    print("当前剩余资源:", available)

def anquan(work, need, allocation):
    n = need.shape[0]
    finish = np.array([False] * n, dtype=bool)
    while not (finish.all()):
        flag = False
        for i in range(n):
            if not finish[i] and (need[i] <= work).all():
                print("安全序列P{}".format(i), end=',')
                flag = True
                work += allocation[i]
                finish[i] = True
                break
        if not flag: return False
    print()
    return True

def main():
    m = int(input("资源种类: "))
    tt = input("各类资源的数量:").split()
    available = np.array(tt, dtype=int)
    n = int(input("进程数量: "))
    max = np.zeros([n, m], dtype=int)
    allocation = np.zeros([n, m], dtype=int)

    for i in range(n):
        tt = input("进程 P{} 的最大需求矩阵向量:".format(i)).split()
        max[i] = np.array(tt, dtype=int)
        if (available < max[i]).any():
            print("输入错误")
            i -= 1

    for i in range(n):
        tt = input("进程 P{} 的分配矩阵向量:".format(i)).split()
        allocation[i] = np.array(tt, dtype=int)
        if (max[i] < allocation[i]).any():
            print("输入错误")
            i -= 1

    need = max - allocation

    for i in allocation:
        available -= i #剩余资源

    printt(available, max, allocation, need)

    while (need != 0).any():
        pid, qq= input("输入请求: ").split(',')
        pid = int(pid[1:])
        qq = np.array(qq.split(), dtype=int)

        if (qq > max[pid]).any():
            print("输入错误")

        else:
            available -= qq
            allocation[pid] += qq
            need[pid] -= qq
            if anquan(available.copy(), need, allocation):
                printt(available, max, allocation, need)
                continue
            else:
                print("不安全 不可分配")
                available += qq
                allocation[pid] -= qq
                need[pid] += qq

if __name__ == '__main__':
    main()

6、运算结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1578355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Enzo Life Sciences--17β-Estradiol high sensitivity ELISA kit

高灵敏ELISA试剂盒&#xff0c;可检测到低至14 pg/ml的17β-雌二醇 雌二醇(estradiol) 是由卵巢内卵泡的颗粒细胞分泌的类固醇激素&#xff0c;是主要的雌激素&#xff0c;负责调节女性特征、附属性器官的成熟和月经-排卵周期&#xff0c;促进乳腺导管系统的产生&#xff0c;有…

机器人客户端如何配置同步消息至多个群中

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 由于微信群的人数&#xff0c;最多是500人&#xff0c;如果有人的业务做的大&#xff0c;可能会同步创建好多个群&#xff0c;但是资料的不想多个群一起发&#xff0c;发给某个群&a…

产品经理和项目经理的区别

1. 前言 本文深入探讨了产品经理与项目经理在职责、关注点以及所需技能方面的显著区别。产品经理主要负责产品的规划、设计和市场定位,强调对用户需求的深刻理解和产品创新的推动;而项目经理则侧重于项目的执行、进度控制和资源管理,确保项目按时、按质、按预算完成。两者在…

[大模型]大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里&#xff0c;大型语言模型(llm)有了飞速的发展&#xff0c;在本文中&#xff0c;我们将探讨几种(量化)的方式&#xff0c;除此以外&#xff0c;还会介绍分片及不同的保存和压缩策略。 说明&#xff1a;每次加载LLM示例后&#xff0c;建议清除缓存&#xff0c;以…

[BT]BUUCTF刷题第13天(4.1)

第13天 Upload-Labs-Linux (Basic) Pass-01 根据题目提示&#xff0c;该题为绕过js验证。 一句话木马&#xff1a; <?php eval(system($_POST["cmd"]));?> // 符号 表示后面的语句即使执行错误&#xff0c;也不报错。 // eval() 把括号内的字符串全部…

「每日跟读」英语常用句型公式 第6篇

「每日跟读」英语常用句型公式 第6篇 1. As ___ as possible 越 ___ 越好 As soon as possible (ASAP)(越快越好) As happy as possible (越快乐越好) As prepared as possible (越有准备越好) As much/many as possible (越多越好 *不可数/可数) As early as possible …

一款轻量、干净的 Laravel 后台管理框架

系统简介 ModStart 是一个基于 Laravel 的模块化快速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 系统特性 …

Chatgpt掘金之旅—有爱AI商业实战篇|内容策展业务|(八)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业内容策展业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着…

017——DS18B20驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 主要特点 1.3 存储器介绍 1.4 时序 1.5 命令 1.5.1 命令大全 1.5.2 命令使用 1.5.3 使用示例 1.6 原理图 二、 驱动程序 三、 应用程序 四、 测试 一、 模块介绍 1.1 简介 DS18B20 温度传感器具有线路简单、体积小的特点&…

HarmonyOS 应用开发-边缓存边播放案例

介绍 OhosVideoCache是一个支持边播放边缓存的库&#xff0c;只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器&#xff0c; OhosVideoCache就可以一边下载音视频数据并保存在本地&#xff0c;一边读取本地缓存返回给播放器&#xff0c;使用者无需进行其他操作…

window环境运行nacos源码

为了研究一下nacos,所以从git上下载了nacos源码并且启动。 1.首先下载源码 git地址&#xff1a;https://github.com/alibaba/nacos.git 2.使用ideal打开源码 nacos的启动通过nacos-console模块执行。 3.修改为单机启动模式 Nacos默认启动是集群模式&#xff0c;单机模式需…

微服务面试题二

1.什么是雪崩 微服务之间相互调用&#xff0c;因为调用链中的一个服务故障&#xff0c;引起整个链路都无法访问的情况。 如何解决雪崩&#xff1f; 超时处理&#xff1a;请求超时就返回错误信息&#xff0c;不会无休止等待仓壁模式&#xff1a;限定每个业务能使用的线程数&a…

【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南(更新中)

目录 一、NeRFStudio安装1.安装&#xff08;ubuntu系统&#xff09;2.安装&#xff08;windows系统&#xff09; 二、安装tinycudann三、Colmap安装与使用1. 安装依赖2. 安装colmap3.使用colmap3.1 可视化界面使用3.2 Nerfstudio命令行调用Colmap 四、使用NeRFStudio进行三维重…

鸿蒙Native输出so动态库,并提供给第三方导入使用

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 API:9 最近在学习鸿蒙的Native输出so动态库&#xff0c;下面就给大家分享下我的学习心得及在实现过程中遇到的问题。 实现需求&#xff1a;通过so库输出文本内容 “你好&#xff0c;鸿蒙&#xff01;” 参考资料…

2.SpringBoot利用Thymeleaf实现页面的展示

什么是Thymeleaf&#xff1f; Thymeleaf是一个现代服务器端Java模板引擎&#xff0c;适用于Web和独立环境&#xff0c;能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。 Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这…

HarmonyOS4.0模拟器安装

我们也可以利用设备模拟器来查看更真实的效果。不过需要先配置模拟器。 首先&#xff0c;选择主菜单中的Tools&#xff0c;找到其中的Device Manager&#xff0c;即设备管理&#xff1a; 安装设备 设备可以是远端设备&#xff0c;也可以是本地设备&#xff0c;我们可以先安装…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

c++的学习之路:18、容器适配器与反向迭代器

摘要 本文有可能讲的不是特别清楚&#xff0c;我也是初学者有的理解可能有偏差欢迎指出&#xff0c;文章末附上导图。 目录 摘要 一、什么是适配器 二、STL标准库中stack和queue的底层结构 三、deque 1、deque的原理介绍 2、deque的缺陷 四、反向迭代器 五、思维导图…

Java设计模式—策略模式(商场打折)

策略这个词应该怎么理解&#xff0c;打个比方说&#xff0c;我们出门的时候会选择不同的出行方式&#xff0c;比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等&#xff0c;这些出行方式&#xff0c;每一种都是一个策略。 再比如我们去逛商场&#xff0c;商场现在正在搞活动&…

STC89C52学习笔记(二)

STC89C52学习笔记&#xff08;二&#xff09; 综述&#xff1a;本文简要介绍了51单片机以及示例了如何成功创建并运行一个程序&#xff08;点亮一个LED&#xff09;。 一、单片机介绍 单片机简称MCU&#xff0c;MCUCPURAMROM定时器中断系统通讯协议等单片机任务是信息采集、…