银行家算法(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语言作为一门现代化的编程语言,具有强大的并发能力和高效的性能,逐渐成为网站开发的首选语言之一。本文将介绍如何…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
