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

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

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、运算结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 应用开发-自定义Swiper卡片预览效果实现

介绍 本方案做的是采用Swiper组件实现容器视图居中完全展示&#xff0c;两边等长露出&#xff0c;并且跟手滑动效果。 效果图预览 实现思路 本解决方案通过维护所有卡片偏移的数组&#xff0c;实时更新卡片的偏移量&#xff0c;以实现swiper子组件内图片居中展示&#xff0c…

DHT11温度检测系统

DHT11温湿度传感器 产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;应用领域&#xff1a;暖通空调&#xff1b;汽车&#xff1b;消费品&#xff1b;气象站&#xff1b;湿度调节器&#xff1b;除湿器&#xff1b;家电&#xff1b;医…

好物推荐:六款让人眼前一亮的个人博客

1.前言 总是有人在问零基础如何搭建个人博客、有哪些好用的博客系统推荐、个人博客和国内技术社区怎么选择&#xff1f;诸如此类的很多问题。对于最后一个问题&#xff0c;我个人的看法很简单&#xff0c;看需求&#xff01; 目前国内做的还不错的技术类社区/论坛其实还是比较…

stack和queue的使用

前言 前面我们对string、vector、list做了介绍并对底层进行了实现&#xff01;本期我们继续来介绍STL容器&#xff0c;stack和queue&#xff01; 本期内容介绍 stack 常用接口的介绍 queue 常用接口的介绍 什么是stack? 这里的栈和我们C语言实现的数据结构的那个栈功能是一样…

RabbitMQ-死信队列常见用法

目录 一、什么是死信 二、什么是死信队列 ​编辑 三、第一种情景&#xff1a;消息被拒绝时 四、第二种场景&#xff1a;. 消费者发生异常&#xff0c;超过重试次数 。 其实spring框架调用的就是 basicNack 五、第三种场景&#xff1a; 消息的Expiration 过期时长或队列TTL…

neo4j使用详解(十一、cypher自定义函数语法——最全参考)

Neo4j系列导航&#xff1a; neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 10.自定义函数 用户定义函数用Java编写&#xff0c;部署到数据库中&#xff0c;并以与任何其他Cypher函数相同的…

Java变量详解

​ 这里写目录标题 第一章、Java中的变量分类1.1&#xff09;变量分类1.2&#xff09;成员变量分类1.3&#xff09;成员变量和局部变量的区别 第二章、成员变量详解2.1&#xff09;成员变量作用域/权限修饰符2.2&#xff09;成员变量和成员属性的区别2.3&#xff09;成员变量初…

网络通信流程

建立完tcp请求再发起http请求 开启系统代理之后&#xff0c;以clash verge为例 127.0.0.1:7897&#xff0c;假设hci.baidu.com的IP为153.37.235.50 发起对hci.baidu.com的HTTP请求&#xff0c;由于开启了系统代理不进行DNS解析&#xff0c;浏览器调用socket()获得一个socket&a…

GlusterFS(GFS)分布式文件系统

一、GlusterFS的概述&#xff1a; GlusterFS 是一个开源的分布式文件系统。 只在扩展存储容器&#xff0c;提高性能 并且通过多个互联网络的存储节点的进行几余&#xff0c;以确保数据的可用性和一致性 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c…

软考中级之软件设计师---知识点汇总总结

软考中级之软件设计师---知识点汇总总结 软考介绍资格设置证书样本 计算机组成原理操作系统1. 进程的三态模型2. 磁盘调度算法 计算机网络1. 网络的分类2. 各层的互连设备3. 网络模型&#xff0c;协议簇4. 传输层协议TCP、UDP4.1 TCP (Transmission Control Protocol,传输控制协…

零代码与低代码开发平台

1、什么是低代码开发平台&#xff1f;什么是零代码开发平台&#xff1f; 零代码开发平台&#xff1a; 指的是不需要写代码就能够快速开发出业务应用/系统的平台。我们在工作中使用的业务应用&#xff0c;主要提供数据收集、数据处理、数据流转和展示等功能。零代码开发平台能够…

【超重磅牛市信号】减半倒计时12天!首波抛售潮接近尾声,大暴涨将如期而至!

3月&#xff0c;美国CPI环比出现小幅反弹由3.1%升至3.2%&#xff0c;美国制造业指数PMI反弹至50.3%呈现进入扩张期的态势&#xff0c;日本结束长达8年的负利率时代首次加息。这导致美国4月降息概率大幅下降&#xff0c;5月降息概率也跌至50%以下。 尽管如此&#xff0c;全球金融…

C#操作MySQL从入门到精通(8)——对查询数据进行高级过滤

前言 我们在查询数据库中数据的时候,有时候需要剔除一些我们不想要的数据,这时候就需要对数据进行过滤,比如学生信息中,我只需要年龄等于18的,同时又要家乡地址是安徽的,类似这种操作专栏第7篇的C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤简单过滤方法就无法…

STL优先队列比较器

有两个比较器&#xff0c;在std里面&#xff0c;一个是greater&#xff0c;一个是less&#xff0c;他们都有一个可以指定的模板类型。 #include <bits/stdc.h> using namespace std; struct node {bool operator ()(const string& a, const string& b){return a…

蓝桥杯刷题-特殊年份

特殊年份 代码&#xff1a; def f(x)->bool:s list(x)if s[0]s[2] and int(s[1])1int(s[3]):return Trueelse:return False cnt 0 for _ in range(5):if f(input()):cnt1 print(cnt)

PC端音乐神器-解锁全网限制

打软件后就能发现&#xff0c;软件不需要我们登录&#xff0c;就可以使用,下载地址&#xff1a;PC端音乐神器.zip

什么是sso?

SSO&#xff08;Single Sign-On&#xff09;&#xff0c;即单点登录&#xff0c;是一种安全协议&#xff0c;它允许用户在多个应用程序之间使用同一组登录凭据进行身份验证。这意味着用户只需要登录一次&#xff0c;就可以访问多个需要身份验证的应用程序。 SSO的工作原理如下…

[C++][算法基础]合并集合(并查集)

一共有 n 个数&#xff0c;编号是 1∼n&#xff0c;最开始每个数各自在一个集合中。 现在要进行 m 个操作&#xff0c;操作共有两种&#xff1a; M a b&#xff0c;将编号为 a 和 b 的两个数所在的集合合并&#xff0c;如果两个数已经在同一个集合中&#xff0c;则忽略这个操…

【JavaEE】_Spring MVC项目获取Header

目录 1. 使用Servlet原生方法获取Header 2. 使用Spring注解获取Header 1. 使用Servlet原生方法获取Header .java文件内容如下&#xff1a; package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*; impor…

【C++进阶】用哈希实现unordered_set和unordered_map的模拟

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 前言&#xff1a; 之前我…