银行家算法之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():清楚字典中的所有的项…

js常用随手记

1. 判断是否是空对象 let myObject{} Object.keys(myObject).length // 0 2. void 0 代替 undefined undefined 不是保留字&#xff0c;在局部作用域下能被重写&#xff0c;因此在 val undefined 是有风险的 并且代替后有以下优点&#xff1a; void 0 占用字节更少void 0 更安…

2020-2021学年(2)操作系统考试重点[华侨大学]

2020-2021学年(2)操作系统考试重点 名词解释 操作系统&#xff1a;操作系统是程序的集合&#xff0c;负责控制和管理软硬件资源&#xff0c;并实现作业调度分时系统&#xff1a;&#xff08;分时性&#xff09;宏观上&#xff0c;多个用户同时工作&#xff0c;共享系统资源。…

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

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

python-循环语句基础知识

#循环语句 x1 while x<100:print(x)x1 name while not name:nameinput("input name:")namename.strip()#删除空格&#xff0c;制表&#xff0c;换行符print(name)w[A,"B",C,D] for i in w:print(i)#内建函数&#xff1a;range()包含下限&#xff0c;不包…

bzoj3160: 万径人踪灭

数组开小gg fft乱搞就可以了。 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const LL mod1e97; const double piacos(-…

光辉岁月:人工智能的那些人和事(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、半同步复…

C++基本数据类型

1.C对基本的数据类型进行了封装&#xff0c;成为内置数据类型。 2.有符号整数在内存中存放为补码&#xff0c;无符号整数在内存中存放为原码&#xff1b; Visual C 基本数据类型类型占用字节数名称占用比特位数bool1布尔型8(signed) char1有符号字符型8unsigned char1无符号字…

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

编译原理课程实践——实现具有初等函数运算语言的解释器或编译器 作者&#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,... 导入模块…

第21条:用函数对象表示策略

第21条&#xff1a;用函数对象表示策略 有些语言支持函数指针&#xff08;function pointer&#xff09;、代理&#xff08;delegate&#xff09;、lambda表达式&#xff08;lambda expression&#xff09;&#xff0c;或者支持类似的机制&#xff0c;允许程序把“调用特殊函数…

2021-2022学年编译原理考试重点[华侨大学]

2021-2022学年编译原理考试重点 注&#xff1a;计算部分请参考 编译原理实验报告 名词解释 编译器&#xff1a;编译阶段&#xff0c;用户输入源程序&#xff0c;经编译器翻译生成目标程序&#xff0c;目标程序在运行时接受输入数据&#xff0c;得到数据输出 解释器&#xff1a…

一文读懂全球半导体市场

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