操作系统实验三:死锁避免程序设计

news/2024/4/28 14:20:21/文章来源:https://blog.csdn.net/wtyuong/article/details/127437180

银行家算法:Python模拟与实现

  • 一、实验目的
  • 二、实验内容
  • 三、实验要求
  • 四、实验代码
    • 结果展示
    • 全部代码

一、实验目的

1、 理解死锁产生的基本原理,以及死锁的必要条件;
2、 掌握死锁避免的基本原理与思路。

二、实验内容

试利用银行家算法对死锁避免算法进行模拟,确保系统在冬天申请资源的同时,永远不会陷入不安全状态。具体要求如下:
(1)程序中进程数量、资源种类数在程序运行时由用户输入;
(2)程序中的资源状态表结构根据输入的进程数量、资源种类数由程序动态生成;
(3)资源状态表中的数量既可以通过随机函数自动产生,也可以由用户手工输入;
(4)程序首先判断系统是否安全,然后在系统安全的前提下,由用户手动完成资源申请,其方法是:先输入或选择进程,然后输入该进程的资源申请要求;
(5)针对用户输入的资源申请,系统应视情况不同给出如下四种执行结果:
1)显示“资源申请不合理”;
2)显示“资源申请超过最大可用资源数,资源不够分配”;
3)显示“找不到安全序列,进程资源申请不予满足”;
4)先显示所找到的安全序列,进而告知用户资源已被分配,并同步修改资源状态表中相关数据。

三、实验要求

1、 写出程序,并调试程序,要给出测试数据和实验结果。
2、 整理上机步骤,总结经验和体会。
3、 完成实验报告和上交程序。

四、实验代码

结果展示

在这里插入图片描述

全部代码

import numpy as npdef get_data(types_of_resources, process_nums):print(types_of_resources, process_nums)Max = np.zeros((process_nums,types_of_resources))Allocation = np.zeros((process_nums,types_of_resources))Need = np.zeros((process_nums,types_of_resources))Available = np.zeros(types_of_resources)print("请输入当前可用的各资源数目: ",end=" ")nums_cnt = input().split()nums_cnt = [int(i) for i in nums_cnt]for i in range(types_of_resources):Available[i]=nums_cnt[i]for i in range(process_nums):print(f"请输入P{i}的需要的最大资源数目:",end=" ")nums_cnt = input().split()nums_cnt = [int(i) for i in nums_cnt]for j in range(types_of_resources):Max[i][j] = nums_cnt[j]for i in range(process_nums):print(f"请输入P{i}已经分配的资源数目:", end=" ")nums_cnt = input().split()nums_cnt = [int(i) for i in nums_cnt]for j in range(types_of_resources):Allocation[i][j] = nums_cnt[j]# 求取Need矩阵for i in range(process_nums):for j in range(types_of_resources):Need[i][j] = Max[i][j] - Allocation[i][j]draw_resource_map(Max, Allocation, Need, Available,types_of_resources, process_nums)return Max, Allocation, Need, Availabledef draw_resource_map(Max,Allocation,Need,Available,types_of_resources, process_nums):kg_num = int(types_of_resources/2)+1print("|---"+'-'*kg_num+"进程"+"--"+"最大需求"+"--"*kg_num+"已占有资源数目"+"--"*kg_num+"最多还需要分配"+"--"*kg_num+"各资源剩余数目"+"--|")for i in range(process_nums):print("| "*kg_num+"P"+str(i)+" "*kg_num+str(list(Max[i]))+" "*kg_num+str(list(Allocation[i]))+" "*kg_num+str(list(Need[i]))+str(list(Available))+"  |")return Nonedef main_banker_algorithm(Max, Allocation, Need, Available,types_of_resources, process_nums):process_sequence = input("请输入请求分配的进程的序号(从0开始):")process_sequence = int(process_sequence)# 请求各个资源的数目Requests = np.zeros(types_of_resources)print("请输入请求的各个资源的数目:",end=" ")nums_cnt = input().split()nums_cnt = [int(i) for i in nums_cnt]for j in range(types_of_resources):Requests[j] = nums_cnt[j]# 判断申请是否超过之前声明的最大需求出# 检查此时系统剩余的可用资源是否满足这次请求flag,Need_cnt,Allocation_cnt,Available_cnt = is_initial_conditions(Need,Allocation,Available,Requests,process_sequence,types_of_resources)if not flag:print("main~无法找到安全序列")else:# 先试着分配,看效果analog_distribution(Max,Need_cnt,Allocation_cnt,Available_cnt,types_of_resources, process_nums)return Nonedef is_initial_conditions(Need,Allocation,Available,Requests,process_sequence,types_of_resources):Need_cnt = NeedAvailable_cnt = AvailableAllocation_cnt = Allocationfor i in range(types_of_resources):# 判断申请是否超过之前声明的最大需求出if Requests[i] > Need[process_sequence][i]:print("申请超过之前声明的最大需求")return Falseelse:Need_cnt[process_sequence][i]-=Requests[i]# 检查此时系统剩余的可用资源是否满足这次请求if Requests[i]>Available[i]:print("此时系统剩余的可用资源不能满足这次请求")return Falseelse:Available_cnt[i]-=Requests[i]Allocation_cnt[process_sequence][i]+=Requests[i]return True,Need_cnt,Allocation_cnt,Available_cntdef analog_distribution(Max,Need_cnt,Allocation_cnt,Available_cnt,types_of_resources, process_nums):# 先找出满足现在当前序列的排在第一个进程the_first_process = []for i in range(process_nums):flag = 0for j in range(types_of_resources):if (Available_cnt[j]>=Need_cnt[i][j]):flag+=1if(flag==types_of_resources):the_first_process.append(i)if len(the_first_process)==0:print("没有找到安全序列")else:for rank in the_first_process:Need, Allocation, Available = Need_cnt,Allocation_cnt,Available_cnt# 记录进程是否执行完毕process_over = [0]*process_numsother = [i for i in range(process_nums) if i!=rank]# 例子,剩下的三种,一共有6种排序方法,这里使用暴力大法(其实这里可以改善,不过没想到好的方法,嘻嘻)# 应该是n!个方法# 如果强行使用n!的暴力方法的话,我感觉是绕园路了,试下走一步弄一部吧# 满足该进程后,彻底回收该进程使用的资源for i in range(types_of_resources):Available[i]+=Allocation[rank][i]# 该进程执行完毕process_over[rank] += 1# 当前路径下的名称road_name=[]road_name.append(rank)# 根据后面的序列判断是否存在合理的程序isRight=True# 用递归的方式查找对应的序列look_for_reods(Need, Allocation, Available,process_over,len(other),road_name,isRight,types_of_resources, process_nums)road_name.pop(-1)process_over[rank] -= 1for i in range(types_of_resources):Available[i] -= Allocation[rank][i]def look_for_reods(Need, Allocation, Available,process_over,geshu,road_name,isRight,types_of_resources, process_nums):if isRight:isRight_cnt=isRightgeshu_cnt = geshu# 先找出满足现在当前序列的排在第一个进程the_first_process = []for i in range(process_nums):if process_over[i]==0:flag = 0for j in range(types_of_resources):if (Available[j] >= Need[i][j]):flag += 1if (flag == types_of_resources):the_first_process.append(i)if len(the_first_process) == 0 and len(road_name)!=process_nums:print(str(list(road_name))+"没有找到安全序列")isRight_cnt=Falsefor rank in the_first_process:Need_cnt, Allocation_cnt, Available_cnt = Need.copy(), Allocation.copy(), Available.copy()# 满足该进程后,彻底回收该进程使用的资源for i in range(types_of_resources):Available_cnt[i] += Allocation[rank][i]# 该进程执行完毕process_over[rank] += 1road_name.append(rank)geshu_cnt=geshu-1if(geshu_cnt==0):print("安全序列为:",end=" ")print(road_name)if isRight_cnt:look_for_reods(Need_cnt, Allocation_cnt, Available_cnt, process_over, geshu_cnt, road_name, isRight_cnt,types_of_resources, process_nums)road_name.pop(-1)process_over[rank]-=1def main():types_of_resources , process_nums = input("请输入资源种类和进程数目:").split(" ")types_of_resources, process_nums = int(types_of_resources) , int(process_nums)Max, Allocation, Need, Available = get_data(types_of_resources, process_nums)while True:main_banker_algorithm(Max, Allocation, Need, Available,types_of_resources, process_nums)return Noneif __name__ == '__main__':main()

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

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

相关文章

人工神经网络概念及组成,人工神经网络基本结构

1、简述人工神经网络的结构形式 神经网络有多种分类方式,例如,按网络性能可分为连续型与离散型网络,确定型与随机型网络:按网络拓扑结构可分为前向神经网络与反馈神经网络。本章土要简介前向神经网络、反馈神经网络和自组织特征映射神经网络…

postman使用excel参数批量执行

postman使用excel参数批量执行第一步,写好连接,报错。参数使用{{name}},这样的划分。保存接口第二步,找到runner。选择接口所在的文件夹,点击runner 第三步,选择接口和文件 点击run,运行,等待接口执行完成

百多安医疗冲刺科创板:半年营收1亿 为张海军与郭海宏夫妻店

雷递网 雷建平 10月20日山东百多安医疗器械股份有限公司(简称:“百多安医疗”)日前递交招股书,准备在科创板上市。百多安医疗计划募资7.6亿元,其中,2.64亿元用于医用导管产业化升级项目,2.48亿元…

《软件测试》实验2:嵌入式软件测试实验报告

文章目录实验目的温度控制器需求文档及测试要求环境搭建实验内容温度采集处理功能测试加热棒输出电压测试散热风扇温度传感器输入接口(Senser_JK)控制加热棒输出接口(Heater_JK)控制散热风扇输出接口(Fan_JK&#xff0…

《设计模式:可复用面向对象软件的基础》——结构型模式(2)(笔记)

文章目录四、结构型模式4.4 DECORATOR(装饰)——对象结构型模式1.意图2.别名补充部分3.动机4.适用性5.结构6.参与者7.协作8.效果9.实现10.代码示例11.相关模式4.5 FACADE(外观)1.意图2.动机3.适用性4.结构5.参与者6.协作7.效果8.实现9.代码示制10.相关模…

Postgresql中yacc语法树冲突解决方法(shift/reduce conflicts)

处理方法 Postgresql中的gram.y可以独立编译,独立编译可以控制bison的参数来打印具体错误: PG15 cd src/backend/parserbison -d -o gram.c gram.y -Wno-deprecated正常执行后会产生gram.c文件,一旦发生冲突,bison会报错&#…

设计模式—关于如何更好的封装与创建对象

上一节我们主要学习了使用设计模式来写代码的指导思想以及设计模式的分门别类,本节主要学习创建型的三种设计模式是怎么使用的。如何利用创建型设计模式来指导我们更好的封装代码更好的创建对象。 为什么要封装?封装能带给我们什么好处?定义变量不会污染外部:封装的首要目的…

神经网络图像识别技术,神经网络指纹识别

1、声纹识别技术未来的发展趋势如何? 近几年来,我国生物识别技术行业市场主体数量呈迅速增长的趋势,截至目前,行业企业数量超4000家。据统计,2013-2018年,我国生物识别技术行业新增企业数量呈逐年增长的趋…

【编程题】【Scratch四级】2022.06 成绩查询

成绩查询 期末考试结束了,小朋友想知道自己考试的成绩和班级排名,让我们一起来实现这个功能吧! 1. 准备工作 (1)保留默认白色背景和小猫角色; (2)创建名为“姓名”和“成绩”的列表,按照图1输入相关内容。 2. 功能实现 (1)点击小绿旗,小猫询问“你要查询谁的成…

JS(第十课)JS中的对象

Com.Java.Basis第九课 《类与对象》_星辰镜的博客-CSDN博客 有兴趣的可以去看一下 本文内容核心:对象 在百度翻译中对象称为object 安装插件 第一部分去找找在JS中对象的语法是什么 如何去创建对象的,调用对象! var name"李四"; var people…

图形学-(视图变换,投影变换)

1.视图变换 在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置。对于相机所做的变换就是视图变换 (Viewing/Camera transformation)。 我们需要对相机位置进行定义,对于一个相机我们要规定下面三个属性: 相…

Transformer3

又是 一篇关于Transformer的~~ 太多了 本文结合Transformer和ConvNets的优点,构造了一种新的即插即用运算符ParC,可以高效地部署在不同的平台上。一个Trick 搞定 CNN与Transformer,即插即涨点即提速! 论文链接:http…

Ansible自动化运维工具介绍与部署

ansible自动化运维工具介绍与部署 文章目录一、什么是自动化运维?二、常用的自动化运维工具2.1 Ansible2.2 SaltStack2.3 Puppet2.4 三种自动化工具特点对比三、介绍Ansible3.1 什么是 Ansible?3.2 Ansible 无需代理3.3 Ansible 方式四、部署Ansible4.1 控制节点4.…

U-BOOT小全(三):SPL框架

1、什么是SPL? 为了可以使已有的所有SPL的设计统一,也为了简化添加适用于新板子的设计,专门设计一个通用的SPL框架。在SPL框架下,一个板子的所有代码都能够被重用。代码复制和链接不再是必要的。 在uboot-2011的/doc/README.spl…

跨境电商必读:什么是社交媒体营销?

关键词:跨境电商,社交媒体营销 社交媒体渠道已迅速成为业务发展战略不可分割的一部分,关于社交媒体如何重塑消费者行为,以及组织如何利用它获得收益,网络上已经有大量相关信息,但仍有许多跨境电商企业难以…

H3C VLAN简单配置

将两台电脑都设为自动获取IP&#xff0c;然后左边的加入vlan10,右边的加入vlan20 先配置左边交换机 <H3C>system-view [H3C]user-interface console 0 [H3C-line-console0]idle-timeout 0 0 [H3C-line-console0]exit [H3C]vlan 10 [H3C-vlan10]port GigabitEthernet 1/…

04-Jenkins构建Maven项目

1&#xff09;Jenkins项目构建类型 a&#xff09;Jenkins构建的项目类型介绍 Jenkins中自动构建项目的类型有很多&#xff0c;常用的有以下三种&#xff1a;自由风格软件项目&#xff08;FreeStyle Project&#xff09;Maven项目&#xff08;Maven Project&#xff09;流水线项…

沉睡者IT - 如何识别NFT“洗盘交易”?

推荐阅读1&#xff1a;【创业粉引流变现项目】 推荐阅读2&#xff1a;【抖音网上如何赚钱变现】 推荐阅读3&#xff1a;【中视频横版16:9视频制作教程】 对金融人士来说&#xff0c;“洗盘交易”&#xff08;wash trading&#xff09;并不是一个新词。加密货币也以相同的买入…

grid管理的数据库实例修改时区问题

问题描述 由于安装创建数据库之前没将操作系统的时区设置为本地正确的时区&#xff08;Pacific/Apia&#xff09;&#xff0c;使用的是GMT时间&#xff08;UTC时区&#xff09;&#xff0c;后续将操作系统和数据库修改成正确时区之后&#xff0c;发现sysdate显示有误。 服务端…

计算机网络基础 ---- 动态路由---OSPF协议----详解

OSPF协议&#xff1a; ospf&#xff1a;开放式最短路径优先协议&#xff08;Open Shortest Path First&#xff09; 一、基本概念&#xff1a; 是携带真实掩码&#xff08;无类别链路状态IGP协议&#xff09;&#xff1b;周期更新&#xff08;30min&#xff09; 触发更新 -…