银行家算法之Python实现[操作系统实验]

银行家算法

银行家算法是著名的死锁避免算法,其思想是:把操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程运行之前先声明对各种资源的最大需求量,当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量。若超过则拒绝分配资源,若未超过则再测试系统现存的资源能否满足该进程尚须的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

问题描述

设计程序模拟避免死锁的银行家算法的工作过程。假设系统中有n个进程:P1,P2,…,PnP_1,P_2,\dots,P_nP1,P2,,Pn,有m类可分配资源R1,…,RmR_1,\dots,R_mR1,,Rm,在某时刻,进程PiP_iPi已分配到的j类资源为Allocation[i][j]Allocation[i][j]Allocation[i][j]个,还需要j类资源need[i][j]need[i][j]need[i][j]个,目前系统剩余j类资源Available[j]Available[j]Available[j]个。

实验要求

  1. 判断当前状态是否安全。若安全,给出安全序列;若不安全,给出理由。
  2. 对于下一个时刻,某个进程提出资源请求Request(R1,…,Rm),使用银行家算法作为判读是否相应该响应该请求的决策依据。
  3. 输入某时刻的资源分配表和进程请求信息,输出安全序列分析,给出决策方案。

数据结构描述

  • 系统可用资源向量Available[m]Available[m]Available[m]
  • 最大需求矩阵Max[n][m]Max[n][m]Max[n][m]
  • 分配矩阵Allocation[n][m]Allocation[n][m]Allocation[n][m]
  • 需求矩阵Need[n][m]Need[n][m]Need[n][m]

其中,n是进程数量,m是资源种类数量。

算法描述

  • 输入:T0时刻的资源分配表
  • 输出:Pi发出资源请求后,进行的安全序列分析表和安全序列。若不安全,则给出不安全产生的原因。
  1. 进程Pi发出请求RequestiRequest_iRequesti,首先检查其合法性,若Requesti≤Need[i]Request_i\le Need[i]RequestiNeed[i]则继续进行,否则报错;
  2. Requesti≤AvailableRequest_i\le AvailableRequestiAvailable,则继续进行,否则认为当前资源不足,不响应当前请求;
  3. 系统试探性把资源分配给进程Pi:
    Available−=RequestiAvailable-=Request_iAvailable=Requesti
    Allocation[i]+=RequestiAllocation[i]+=Request_iAllocation[i]+=Requesti
    Need[i]−=RequestiNeed[i]-=Request_iNeed[i]=Requesti
  4. 使用银行家算法进行安全性检查,检查此次资源分配后,系统是否处于安全状态,若安全才正式将资源分配给进程Pi;否则本次的试探作废,Pi继续等待。安全性检查算法如下:
    1. 设置工作量Work[m]Work[m]Work[m],表示系统中剩余的可用资源数目。在安全性检查开始时,置Work=Available;
    2. 初始时安全序列为空;
    3. 遍历Need矩阵行,找出一行k,该行对应的Pk不在安全序列中,且Need[k]≤WorkNeed[k]\le WorkNeed[k]Work,将对应Pk插入安全序列,若找不到则跳过下一步;
    4. 更新Work=Work+Allocation[k]Work=Work+Allocation[k]Work=Work+Allocation[k],表征Pk获取资源并运行结束后,将资源释放的过程。返回上步,继续寻找下一个可以分配资源的进程;
    5. 此时,安全序列中若存在所有进程,则系统处于安全状态,否则系统不安全。

算法流程图

在这里插入图片描述

结果分析

设置n=5;m=3
T0时刻资源分配表
Available: [3 3 2]
P Allocation Need
0 [0 1 0] [7 4 3]
1 [2 0 0] [1 2 2]
2 [3 0 2] [6 0 0]
3 [2 1 1] [0 1 1]
4 [0 0 2] [4 3 1]

(1)P1请求资源,Request1 = [1, 0, 2]
✅VALID CHECK PASSED!
✅RESOURCE CHECK PASSED!
通过合法性和资源检查,假定为P1分配资源,然后进行安全性检查:
P Work Need Allocation Work+Allocation
1 [2 3 0] [0 2 0] [3 0 2] [5 3 2]
3 [5 3 2] [0 1 1] [2 1 1] [7 4 3]
0 [7 4 3] [7 4 3] [0 1 0] [7 5 3]
2 [7 5 3] [6 0 0] [3 0 2] [10 5 5]
4 [10 5 5] [4 3 1] [0 0 2] [10 5 7]
✅SAFE CHECK PASSED!
Secured Sequence is [1, 3, 0, 2, 4].
通过安全性检查,为P1分配资源,输出当前资源分配信息:
Available: [2 3 0]
P Allocation Need
0 [0 1 0] [7 4 3]
1 [3 0 2] [0 2 0]
2 [3 0 2] [6 0 0]
3 [2 1 1] [0 1 1]
4 [0 0 2] [4 3 1]

(2)T1时刻,P4继续请求资源
Request4 = [3, 3, 0]
✅VALID CHECK PASSED!
⭕️REQUEST EXCEEDS AVAILABLE!
Request4<=Need[4],但Request4>Available,资源检查失败,P4等待分配资源

(3)T2时刻,P0请求资源
Request0 = [0, 2, 0]
✅VALID CHECK PASSED!
✅RESOURCE CHECK PASSED!
⭕️SAFE CHECK FAILED!
通过合法性和资源检验,假设为P0分配资源,此时Available不满足银行家算法,安全性检验失败,若为P0分配资源会导致死锁,故返回原始状态。

(4)T3时刻,P3请求资源
Request3 = [0, 2, 1]
⭕️Exception: ERROR!P3 REQUEST EXCEEDS ITS NEED!
报错,因为请求资源大于了需求量!

在这里插入图片描述

附录:代码

# @Sylvan Ding 2022.05.31import numpy as npdef err(P):raise Exception("ERROR!P{} REQUEST EXCEEDS ITS NEED!".format(P))def valid_check(P, Request, Need):if np.sum(Request > Need[P, :]):err(P)print("\033[0;32mVALID CHECK PASSED!\033[0m")def resource_check(Request, Available):if np.sum(Request > Available):print("\033[0;31mREQUEST EXCEEDS AVAILABLE!\033[0m")return Falseelse:print("\033[0;32mRESOURCE CHECK PASSED!\033[0m")return Truedef safe_check(Work, Need, Allocation, n):Q = []while True:i = 0while i < n:if i not in Q and not np.sum(Need[i, :] > Work):Q.append(i)temp = Work.copy()Work = Work + Allocation[i, :]print_safe_check(i, temp, Need, Allocation, Work)breaki = i + 1if i == n:breakif len(Q) < n:print("\033[0;31mSAFE CHECK FAILED!\033[0m")return Falseelse:print("\033[0;32mSAFE CHECK PASSED!\nSecured Sequence is {}.\033[0m".format(Q))return Truedef try_allocate(Available, Allocation, Need, Request, P):Available = Available - RequestAllocation[P, :] = Allocation[P, :] + RequestNeed[P, :] = Need[P, :] - Requestreturn Available, Need, Allocationdef print_safe_check(k, Work, Need, Allocation, Work_Allocation):print("{}\t {}\t {}\t {}\t {}".format(k,Work,Need[k, :],Allocation[k, :],Work_Allocation))def print_resource(Available, Need, Allocation, n):print("Current resource information: ")print("Available: {}".format(Available))print("P\t Allocation\t Need")for i in range(n):print("{}\t {}\t {}".format(i, Allocation[i, :], Need[i, :]))def print_request_info(P, Request):print("\033[0;33mP{} requests {}.\033[0m".format(P, Request))def Banker(n, Available, Max, Allocation, P, Request):""":param n: int:param Available: array[n][m]:param Max: array[n][m]:param Allocation: array[n][m]:param P: index of process to request:param Request: array[m]:return: Available, Need, Allocation"""print_request_info(P, Request)Available = np.asarray(Available)Max = np.asarray(Max)Allocation = np.asarray(Allocation)Request = np.asarray(Request)Need = Max - Allocationprint_resource(Available, Need, Allocation, n)valid_check(P, Request, Need)if (resource_check(Request, Available) andsafe_check(*try_allocate(Available.copy(),Allocation.copy(),Need.copy(),Request, P), n)):Available, Need, Allocation = try_allocate(Available.copy(),Allocation.copy(),Need.copy(),Request, P)print_resource(Available, Need, Allocation, n)return Available, Need, Allocationdef BankerAlgorithm():n = 5# m = 3Available = [3, 3, 2]Max = [[7, 5, 3],[3, 2, 2],[9, 0, 2],[2, 2, 2],[4, 3, 3]]Allocation = [[0, 1, 0],[2, 0, 0],[3, 0, 2],[2, 1, 1],[0, 0, 2]]P1 = 1Request1 = [1, 0, 2]Available, Need, Allocation = Banker(n, Available, Max, Allocation, P1, Request1)P4 = 4Request4 = [3, 3, 0]Available, Need, Allocation = Banker(n, Available, Max, Allocation, P4, Request4)P0 = 0Request0 = [0, 2, 0]Available, Need, Allocation = Banker(n, Available, Max, Allocation, P0, Request0)P3 = 3Request3 = [0, 2, 1]Banker(n, Available, Max, Allocation, P3, Request3)if __name__ == '__main__':BankerAlgorithm()

原创文章:转载请注明出处 ©️ Sylvan Ding

参考文献

  1. 2023年操作系统考研复习指导/王道论坛考研组编.——北京:电子工业出版社,2021.12

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

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

相关文章

城市智能化发展中,AI公司应该做什么?

来源&#xff1a;虎嗅APP题图来源:视觉中国在上海长宁区的部分区域&#xff0c;你会发现共享单车总是能够整整齐齐的排列&#xff0c;并且在每一个你需要的街道路边&#xff0c;都能找到空闲的单车&#xff0c;既不会车辆爆满&#xff0c;也不会无车可骑。这些城市细微之处的体…

getchar(),putchar()用法

1.getchar函数可以接收用户输入的多个字符&#xff0c;只用等用户按下回车键后&#xff0c;getchar()函数才会从键盘缓冲区依次读出字符&#xff1b; 2.getchar()和putchar()结合使用&#xff0c;可以将读取的字符输出到屏幕&#xff1b; 3.函数原型&#xff1a; int getchar…

[操作系统]页面置换算法实验及C++实现(OPT、FIFO、LRU)

虚拟内存页面置换算法实验&#xff08;OPT、FIFO、LRU&#xff09; 进程运行时&#xff0c;若其访问的页面不再内存中而需将其调入&#xff0c;但内存已无空闲空间时&#xff0c;就需要从内存中调出一页程序或数据&#xff0c;送入磁盘的对换区。选择调出页面的算法就称为页面…

智谱AI多项成果惊艳亮相2021北京智源大会

来源&#xff1a;学术头条2021 年 6 月 1 日&#xff0c;由北京智源人工智能研究院&#xff08;以下简称 “智源”&#xff09;主办的 2021 北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。包括 Yoshua Bengio、David Patterson 等图灵奖获得者在内的两百余位国…

python-字典方法

1.字典的格式化字符串在转换说明符%后面加上键(圆括号括起来)&#xff1b;phonebook{"A":45,"B":"56"} s"As phone number is %(A)s." print(s%phonebook) 运行结果&#xff1a; #字典方法&#xff1a; #clear():清楚字典中的所有的项…

获得诺贝尔奖的底层小职员 | 从来没有一个高手,是在一夜之间强大起来的

来源&#xff1a;Pinterest优选2019年初NHK的一个访谈纪录片&#xff0c;看哭了很多网友。“感动&#xff0c;这才是真正的大神啊&#xff01;”纪录片的主人公&#xff0c;是2002年的诺贝尔化学奖得主——田中耕一。十九年前&#xff0c;他的获奖几乎是“都市传说”般的爆炸新…

光辉岁月:人工智能的那些人和事(1)

来源&#xff1a;图灵人工智能源头茫昧虽难觅&#xff0c;活水奔流喜不休。——法国数学家亨利庞加莱&#xff08;Henri Poincare&#xff09;目前&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;正在迅速崛起。现已面世的AI应用&#xff…

MySQL主从架构及读写分离实战

​​​​​​ 目录 一、实验目的与环境 二、基础环境介绍 三、搭建主从集群 1、理论基础 2、同步的原理 3、搭建主从集群 3.1 配置master主服务器 3.2 配置slave从服务 3.3 主从集群测试 3.4 集群搭建扩展&#xff1a; 3.5、GTID同步集群 4、集群扩容 5、半同步复…

编译原理课程实践——实现一个初等函数运算语言的解释器或编译器

编译原理课程实践——实现具有初等函数运算语言的解释器或编译器 作者&#xff1a;Sylvan Ding &#xff5c;转载请注明文章出处&#xff01; 摘要&#xff1a;本文主要内容是设计词法分析器、语法分析器&#xff08;LL(1)、SLR(1)&#xff09;和语义分析器&#xff08;基于SL…

数据结构开发(3):线性表的顺序存储结构

0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList3.2 StaticList 和 DynamicList4.顺序存储线性表的分析 4.1 效率分析4.2 功能分析5.小结 1.线性表的本质和操作 线性表 ( List ) 的表现形式&#xff1a; 零个或多个数据元…

小目标检测的一些问题,思路和方案

来源&#xff1a;机器学习研究组订阅机器学习正越来越多地进入我们的日常生活。从个人服务的广告和电影推荐&#xff0c;到自动驾驶汽车和自动送餐服务。几乎所有的现代自动化机器都能“看”世界&#xff0c;但跟我们不一样。为了像我们人类一样看到和识别每个物体&#xff0c;…

python-条件语句

#条件、循环和其他语句 #print:可以打印多个表达式&#xff0c;表达式之间用逗号隔开 print(a,"b",False)#参数并不构成一个元组 模块导入:import x :导入模块xfrom x import func &#xff1a;导入模块x的函数funcfrom x import func1,func2,... 导入模块…

一文读懂全球半导体市场

来源&#xff1a;深城物联作者&#xff1a;孙卓异&#xff0c;供职于赛迪顾问集成电路产业研究中心 半导体是当今信息技术产业高速发展的基础和原动力&#xff0c;已经高度渗透并融合到了经济、社会发展的各个领域&#xff0c;其技术水平和发展规模已经成为衡量一个国家产业竞争…

如何写好一份技术简历?

写简历的基本目的和策略 大部分情况下&#xff0c;写简历是找工作的第一步&#xff0c;考虑到第二步就是面试&#xff0c;那么简历就是敲门砖&#xff0c;为了让企业认识到你的价值&#xff0c;必须把自己的真实水平描述出来&#xff0c;展现出你有能力应对这份工作。甚至要体现…

这是我看过最全的工业机器人知识介绍 !

来源&#xff1a;产业智能官编者按工业机器人广泛使用在产业制造上&#xff0c;汽车制造、电器、食品等&#xff0c;能替代反复机器式操纵工作&#xff0c;是靠本身动力和控制才能来实现种种功用的一种机器。它能够承受人类指挥&#xff0c;也能够按照事先编排的程序运转。今天…

表白网站|程序猿的爱情记录网站模版|情侣日记网页

程序猿的爱情记录网站模版&#xff5c;情侣日记网页设计 介绍 我为我的女朋友制作了这个主页&#xff0c;目的是记录一些值得纪念的时刻。 如果需要&#xff0c;您可以复制和修改此模板作为送给女朋友或妻子的礼物。 Demo Click here to review the website! ❤️ https://…

python-字符串方法

#find方法&#xff1a;查找子串&#xff0c;返回子串所在位置的最左端索引&#xff0c;如果没有找到则返回-1 s"agsa" print(s.find("gs")) print(s.find("agsaa")) #可以指定匹配的起始点和结束点参数,包含第一个索引&#xff0c;不包含第二个索…

智慧食堂数据分析系统

智慧食堂数据分析系统&#xff5c;大数据分析&#xff5c;数据可视化 Demo Repo&#xff1a;https://github.com/sylvanding/AI-Restaurant-Data-Analysis项目演示&#xff08;模拟真实运行环境&#xff09;&#xff1a;http://analysis.sylvanding.online数据展示静态页面&am…

鸿蒙系统全面解析,诞生背景、技术细节生态圈一文看懂

编辑&#xff1a;智东西内参华为6月2日正式发布的鸿蒙系统无疑占据了最近热点话题的C位&#xff0c;虽然不全是赞美的声音&#xff0c;但这种努力打破美国垄断&#xff0c;挑战谷歌、苹果在移动操作系统上垄断地位的尝试必将成为中国科技史上的里程碑事件。本期的智能内参&…

python-字典

字典映射&#xff1a;通过名字来引用值&#xff1b;字典是python中唯一内建的映射类型&#xff1b;1)创建字典&#xff1a;字典有键-值对(项)组成&#xff0c;键和值之间通过冒号(:)隔开&#xff0c;项之间通过逗号(,)分割&#xff0c;整个字典由大括号括起来&#xff1b;空字典…