银行家算法(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语言作为一门现代化的编程语言,具有强大的并发能力和高效的性能,逐渐成为网站开发的首选语言之一。本文将介绍如何…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...