当前位置: 首页 > news >正文

银行家算法(Python实现)

银行家算法,以及安全检测算法:

import copy# 银行家算法(资源分配合法性)
def BankersAlgorithm(Process_num, Resources_num, Request, Max, Available, Allocation, Need):PID = Request['PID']  # 获取发起请求的进程ID# Step1.如果该进程(PID)请求的RID类资源个数加上已经给它分配的RID类资源的个数小于等于该进程PID类资源最大需求量则转入Step2,否则报错,中断返回for rId in range(1, Resources_num):if Request['Request_num'][rId] + Allocation[PID][rId] > Max[PID][rId]:print('Request resource overage!')return  # 请求非法,终止分配# Step2.若PID进程请求RID类资源个数小于等于当前可分配的资源个数,则转向Step3.否则系统中RID类资源不能满足该PID进程PID的资源申请,将其阻塞for rId in range(Resources_num):if Request['Request_num'][rId] > Available[rId]:print('Insufficient resources!')return  # 资源不足,终止分配,进入阻塞队列# Step3.系统资源试分配for rId in range(Resources_num):Available[rId] = Available[rId] - Request['Request_num'][rId]  # 更新系统剩余可用资源Allocation[PID][rId] = Allocation[PID][rId] + Request['Request_num'][rId]  # 更新各进程已分配资源Need[PID][rId] = Need[PID][rId] - Request['Request_num'][rId]  # 更新各进程资源需求# 安全检查算法(资源分配合理性)
# 拿什么来检查就合理了?--如果该进程下一次请求其剩余所需的全部资源时,会不会发生资源不足的情况。
def security_check(Process_num, Resources_num, Request, Available, Allocation, Need):# Step1 工作向量Work[1:m](m表示资源种数) 表示系统当前可供分配的各资源个数,执行算法开始时Work = AvailableWork = copy.deepcopy(Available)  # 重要!! copy.deepcopy() 深度拷贝,浅拷贝(具体原因不再深究)# Step2 布尔型向量Finish[1:n] 表示是否有足够的资源分配给各进程,使之运行完成。开始时Finish[i] = false。Finish = [False] * Process_num  # 初始化所有进程的可执行状态sequence = []  # 初始化安全序列(主要是方便后续存储)# Step3.寻找安全进程为什么这里就单单加一个大循环就能找出符合要求的序列?--因为Available一直在增加for _ in range(Process_num):  # 重要!!! 每轮至少需要找出一个安全进程,至多Process_num轮可找出安全序列for pID in range(Process_num):  # 遍历进程sign = 1  # 是否满足资源充足的标志位if Finish[pID] == False:for rId in range(Resources_num):  # 遍历每种资源的需求量if Need[pID][rId] > Work[rId]:  # 需要的某类资源大系统当前拥有的资源时#标志位 置0sign = 0break  # 放弃本轮对该进程的其它资源检查if sign != 0:  # sign != 0,表示该进程各资源需求可以满足# 这里实际是需要给该进程分配资源,由于只是检查,再加之并发实际是串行,分配了执行完毕还得回收# 所以没有进行:Available = Available - Need#            Availbale = Available + Needfor rId in range(Resources_num):# 可以完成,并释放出分配给它的资源,故应该执行:Work[rId] = Work[rId] + Allocation[pID][rId]  # 将之前分配的资源回收# 该进程若运行有足够的资源,故置Finish[i] = TrueFinish[pID] = Truesequence.append(f'P{pID}')  # 将改进程添加到安全序列中# Step4 如果所有进程的Finish[i]== True,说明所有进程都已经出现在安全序列中,表明当前系统处于安全状态,只要有一个进程的Finish为false则当前系统处于不安全状态if all(Finish):return sequence  # 返回该安全序列else:# 安全序列不存在,驳回银行家算法的分配操作(加回去)PID = Request['PID']for rId in range(Resources_num):Available[rId] = Available[rId] - Request['Request_num'][rId]  # 更新系统剩余可用资源Allocation[PID][rId] = Allocation[PID][rId] + Request['Request_num'][rId]  # 更新各进程已分配资源Need[PID][rId] = Need[PID][rId] - Request['Request_num'][rId]  # 更新各进程资源需求return sequence  # 照例返回,但这不是一个完整的安全序列,调用者需要判断if __name__ == '__main__':# 初始化:Process_num = 3  # 并发进程个数Resources_num = 3  # 系统资源种类个数Resources_All = [8, 3, 6]  # 各系统资源的总个数# 进程资源申请矩阵Request = {'PID': 0, 'Request_num': [1, 0, 0]}  # Process_name:发出该请求的经进程PID,Request_num:请求的各类资源数量 安全# 各进程已分配(持有)的资源数量矩阵Allocation = [[0, 0, 0],[4, 1, 2],[1, 0, 1]]# 进程需要的最大资源数量Max = [[5, 3, 2],[7, 3, 4],[3, 0, 2]]# 当前系统可分配资源矩阵(动态计算)Available = []for rId in range(Resources_num):Allocation_sum = 0for pId in range(Process_num):Allocation_sum += Allocation[pId][rId]Available.append(Resources_All[rId] - Allocation_sum)# 各进程还需要的各资源数量矩阵(动态计算)Need = []for pId in range(Process_num):need = []for rId in range(Resources_num):need.append(Max[pId][rId] - Allocation[pId][rId])Need.append(need)# 调用银行家算法BankersAlgorithm(Process_num, Resources_num, Request, Max, Available, Allocation, Need)sequence = security_check(Process_num, Resources_num, Request, Available, Allocation, Need)# 检查得到的进程序列是否包含了全部进程,如果包含全部进程则是一个安全序列,否则不是安全序列if len(sequence) == Process_num:print(f'系统安全,允许分配请求。存在安全序列:{sequence}')else:print('不存在安全序列,系统不安全。驳回分配请求!!!')

相关文章:

银行家算法(Python实现)

银行家算法,以及安全检测算法: import copy# 银行家算法(资源分配合法性) def BankersAlgorithm(Process_num, Resources_num, Request, Max, Available, Allocation, Need):PID Request[PID] # 获取发起请求的进程ID# Step1.如…...

安装终端 ·Terminator

安装终端 在 ROS 中,需要频繁的使用到终端,且可能需要同时开启多个窗口,推荐一款较为好用的终端:**Terminator。**效果如下: 1.安装 sudo apt install terminator2.添加到收藏夹 显示应用程序 —> 搜索 terminator —> 右击 选择 添…...

【Python文件操作的其他例子】

A.Python文件操作的其他例子 当然,以下是一些Python文件操作的其他例子: 1. 读取文件内容: with open(example.txt, r) as f:content f.read()print(content)这个例子会打开名为’example.txt’的文件,读取其内容,…...

使用Terraform管理已经存在的kubernates和默认的节点池

背景: 通过terraform resource "alicloud_cs_managed_kubernetes" "k8s" {...}创建集群时,会产生一个默认的节点池default-nodepool,但是如何去修改这个默认节点池的信息呢? 解决思路: 因为Ter…...

在HTML当中引入Vue控件,以element-ui为例

前情:需要实现一个同时满足按天、按周、按月选择的时间选择器,但是以HTML为基础写的都不太满足我的要求,要么只能按天选择,要么就是想选择久远的时间得点很久,除非自己写捷径,所以就看上了element-ui的这个…...

UE5实现相机水平矫正

UE5实现相机水平矫正 思路,用HIT获得基于相机视角的 离散采样点,然后根据距离相机距离进行权重分析。 距离越近,采样约中心,即越接近人眼注意点,最后算出加权平均高度,赋予给相机,相机将水平旋…...

Word插入Latex语句并编译为数学公式

WPS不可行,正版word可以(垃圾WPS) 选中Latex语句并按下Alt (此处以后补一张图) 该方法不需要额外安装什么插件哦!...

Google Play PolicyBytes 政策更新中文视频 | 2023 年 10 月

Google Play 持续帮助开发者开启成功出海之旅,为用户提供安全优质的应用。也感谢大家与我们携手合作,继续努力将 Google Play 打造为一个安全可信赖的平台。欢迎您观看 Google Play PolicyBytes 中文视频了解 2023 年 10 月政策更新内容,更及…...

pytorch-fastrcnn识别王者荣耀敌方英雄血条

文章目录 前言效果如下实现训练数据获得训练数据和测试数据yaml文件训练py画框文件的修改py测试py升级 前言 最近看王者荣耀视频看到了一个别人提供的一个百里自动设计解决方案,使用一个外设放在百里的二技能上,然后拖动外设在屏幕上滑动,当外设检测到有敌方英雄时外设自动松开…...

阿里云推出通义千问App,提供全方位的协助

🦉 AI新闻 🚀 阿里云推出通义千问App,提供全方位的协助 摘要:阿里云旗下大模型通义千问App登陆各大安卓应用市场,具有超大规模预训练模型,可在创意文案、办公助理、学习助手、趣味生活等方面协助用户。功…...

深入解析 Spring Framework 中 @Autowired 注解的实现原理

关于Autowired注解的作用 Autowired 注解在Spring中的作用是实现依赖注入(Dependency Injection),它用于自动装配(autowiring)Spring Bean 的依赖关系。具体来说, Autowired 注解有以下作用: …...

电脑数据文件恢复工具easyrecovery14中文版

当不小心将回收站的文件删除了怎么办?想找回但是不知道怎么找回需要的数据文件?别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具,easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件,这款软件功能…...

Android NDK开发详解之Application.mk探秘

Android NDK开发详解之Application.mk探秘 概览变量APP_ASFLAGSAPP_ASMFLAGSAPP_BUILD_SCRIPTAPP_CFLAGSAPP_CLANG_TIDYAPP_CLANG_TIDY_FLAGSAPP_CONLYFLAGSAPP_CPPFLAGSAPP_CXXFLAGSAPP_DEBUGAPP_LDFLAGSAPP_MANIFESTAPP_MODULESAPP_OPTIMAPP_PLATFORMAPP_PROJECT_PATHAPP_STL…...

(草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。

子窗口向主窗口发射信号。 只需要插入两行代码 class CodeSettingWindow(Ui_CodeSetting, QMainWindow):_signal pyqtSignal(int, int, int) # 这个信号要放在class之下,———init————函数上def __init__(self):# self.Win_X, self.Win_Y, self.CodeNum表示…...

Golang Web3钱包开发指南

简介 以太坊(Ethereum)是目前最受欢迎的区块链平台之一,它提供了智能合约功能和去中心化应用(DApps)的开发能力。在以太坊生态系统中,Web3钱包扮演着关键角色,允许用户管理账户和密钥、发送交易…...

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库安装 IndexDB类库引入 localForage测试 新增数据、获取数据 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 大部分场景使用 LocalStore都…...

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式 Hadoop Local (Standalone) Mode 单机模式 1. 修改yum源 并升级内核和软件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecacheyum -y update2. 安…...

jenkins工具系列 —— 删除Jenkins JOB后清理workspace

文章目录 问题现象分析解决思路脚本实现问题现象分析 Jenkins使用过程中,占用空间最大的两个位置: 1 、workspace: 工作空间,可以随便删除,删除后再次构建时间可能会比较长,因为要重新获取一些资源。 2 、job: 存放的是项目的配置、构建结果、日志等。不建议手动删除,…...

超越人眼,好用的OCR软件推荐

OCR技术(Optical Character Recognition)是一种将图像或扫描的文字转化为可编辑、搜索、存储、分享的文本的技术。OCR技术除了能够将纸质文档数字化,还可以将手写文本、印刷文本、数码照片中的文字等转化为电子文本。 以下是几个比较知名的O…...

Go语言开发网站

引言 随着互联网的迅速发展,网站已经成为人们获取各种信息和服务的主要途径。而开发一个高性能、可扩展的网站是一项挑战。Go语言作为一门现代化的编程语言,具有强大的并发能力和高效的性能,逐渐成为网站开发的首选语言之一。本文将介绍如何…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

OpenLayers 可视化之热力图

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...