【操作系统】实验:进程死锁

news/2024/9/18 12:31:16/ 标签: 算法, c++, 开发语言

目录

一、实验目的

二、实验要求

三、实验步骤

四、核心代码

五、记录与处理

六、思考

七、完整报告和成果文件提取链接


一、实验目的

1掌握死锁的基本概念;

2理解死锁的必要条件;

3理解避免死锁的方法、安全状态等重要概念;

4了解银行家算法——避免死锁的一种重要方法,理解算法思想及

具体实现。

二、实验要求

1.模拟实现银行家算法

2.本实验要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效地防止和避免死锁的发生。

3.用银行家算法实现资源分配。

4.进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

5.要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。

三、实验步骤

1.初始状态安全性检查

2.各进程请求资源,银行家算法完成分配

流程图举例:

四、核心代码

void show() {//展示当前的各个矩阵的情况 cout<<"系统当前剩余可用资源如下:"<<endl;for(int i=0; i<m; i++) {cout<<Available[i]<<" ";}cout<<endl;cout<<"系统当前资源分配如下:"<<endl;cout<<"进程名\t"<<"Max\t"<<"Allocation\t"<<"Need"<<endl;for(int i=0; i<n; i++) {cout<<"P"<<i<<'\t';for(int j=0; j<m; j++)cout<<Max[i][j]<<" ";cout<<'\t'<<"  ";for(int j=0; j<m; j++)cout<<Allocation[i][j]<<" ";cout<<'\t'<<" ";for(int j=0; j<m; j++)cout<<Need[i][j]<<" ";cout<<endl;}
}
void safe() {//判断初始资源是否安全 int cnt=0;for(int i=0; i<m; i++)work[i]=Available[i];//将初始的资源数赋值给workfor(int i=0; i<n; i++) {//判断是否存在安全序列int flag=1;if(over[i])continue;else {//判断当前可用资源数是否大于Need矩阵for(int j=0; j<m; j++) {if(Need[i][j]>work[j]) {flag=0;break;}}}if(flag==1) {//满足条件就更新work数组;并且重头开始遍历over[i]=true;for(int j=0; j<m; j++) {work[j]=work[j]+Allocation[i][j];}list[cnt++]=i;i=-1;}}int demo=1;for(int i=0; i<n; i++) {if(!over[i]) {cout<<"该序列不安全,应该禁止分配!"<<endl;demo=0;exit(0);}}if(demo==1) {cout<<"该状态安全,其中一个安全序列为:";for(int i=0; i<n; i++) {cout<<"P"<<list[i]<<" ";}cout<<endl;}
}void process() {//判断某个进程是否可以请求资源分配 cout<<"请输入你想分配资源的进程号(0-n-1):"<<endl;int id;cin>>id;int Request[M];cout<<"请输入你想为该进程分配的资源数:"<<endl;memset(work,0,sizeof work);for(int i=0; i<m; i++)cin>>Request[i];int flag=1,flag2=1;for(int i=0; i<m; i++) {if(Request[i]>Need[id][i]) {flag=0;break;}}if(flag==0) {cout<<"请求资源数大于需求资源数,拒绝分配!"<<endl;continues();}for(int i=0; i<m; i++) {if(Request[i]>Available[i]) {flag2=0;break;}}if(flag2==0) {cout<<"请求的资源数大于剩余可用资源数,拒绝分配!"<<endl;continues();}if(flag==1&&flag2==1) { //满足基本请求条件for(int i=0; i<m; i++) {work[i]=Available[i];work[i]-=Request[i];Need[id][i]-=Request[i];Allocation[id][i]+=Request[i];Available[i]-=Request[i];}memset(over,false,sizeof over);//初始化序列为未判断memset(list,0,sizeof list);//清空安全序列数组int cnt=0;for(int i=0; i<n; i++) {//判断是否存在安全序列int flag=1;if(over[i])continue;else {//判断当前可用资源数是否大于Need矩阵for(int j=0; j<m; j++) {if(Need[i][j]>work[j]) {flag=0;break;}}}if(flag==1) {//满足条件就更新work数组;并且重头开始遍历over[i]=true;for(int j=0; j<m; j++) {work[j]=work[j]+Allocation[i][j];}list[cnt++]=i;i=-1;}}int demo=1;for(int i=0; i<n; i++) {if(!over[i]) {show();cout<<"该序列不安全,应该禁止分配!"<<endl;demo=0;break;}}if(demo==0) {for(int i=0; i<m; i++) {Need[id][i]+=Request[i];Allocation[id][i]-=Request[i];Available[i]+=Request[i];}show();continues();}if(demo==1) {show();cout<<"该状态安全,其中一个安全序列为:"<<endl;for(int i=0; i<n; i++) {cout<<"P"<<list[i]<<" ";}cout<<endl;continues();}}
}

五、记录与处理

输入的进程数和资源数如图所示:

选择进行进程请求分配并且输入分配资源的进程号和资源数:

显示当前序列不安全:

六、思考

死锁避免和死锁预防的区别和联系是什么?

1.区别:

处理方式:死锁预防是计算机操作系统在设计时确定资源分配算法,通过破坏产生死锁的必要条件来严格防止死锁的出现。这通常涉及到在资源分配之前对系统状态进行静态分析,并预先采取措施来避免死锁。而死锁避免则更侧重于在系统运行过程中动态地避免死锁的发生。它通过对进程发出的每一个系统能够满足的资源申请进行动态检查,根据检查结果决定是否分配资源,以预防死锁的发生。

系统性能影响:虽然死锁预防能够严格地防止死锁的出现,但它可能严重地影响系统性能,因为可能需要限制资源的并发访问,以降低死锁的风险。而死锁避免则相对灵活,它可以在满足系统性能要求的同时,动态地调整资源的分配,以减少死锁的可能性。

2.联系:

死锁避免和死锁预防都是为了解决计算机系统中的死锁问题,以提高系统的稳定性和效率。它们都关注资源的分配和使用,试图通过合理的策略来避免死锁的发生。此外,虽然它们在处理死锁问题的方式和侧重点上有所不同,但在某些情况下,也可以结合使用,以提供更全面和有效的死锁解决方案。

综上所述,死锁避免和死锁预防在处理死锁问题时有着不同的策略和方法,但它们都是为了提高计算机系统的稳定性和效率,解决可能出现的死锁问题。

七、完整报告和成果文件提取链接

链接:https://pan.baidu.com/s/1UbP6729pCluscVW0_9oI8w?pwd=1xki 
提取码:1xki 


http://www.ppmy.cn/news/1516403.html

相关文章

Windows环境如何安装maven并配置IDEA

运行Springboot项目时&#xff0c;出现了依赖错误&#xff0c;最后排查可能是maven安装出错了。 MAVEN版本要和IDEA版本对应&#xff0c;maven发行版本不能比idea版本高&#xff0c;可以在idea查看内置的maven版本。 点击 File–>Settings,在设置页面搜索maven&#xff0c;如…

2024牛客暑期多校训练营7 D.Interval Selection(异或哈希+双指针)

原题链接&#xff1a;D.Interval Selection 题目大意&#xff1a; 给你一个长度为 n n n 的数组 a a a&#xff0c;定义一个区间 [ l , r ] [l,r] [l,r] 内的连续子数组为好的&#xff0c;当且仅当这个子数组内的所有元素 a l , a l 1 , . . . , a r a_{l},a_{l1},...,a_{…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

Python实现贪心算法

目录 贪心算法简介贪心算法的基本思想贪心算法的应用场景活动选择问题 Python实现活动选择问题代码解释活动选择问题的解贪心算法的正确性分析贪心算法的其他应用贪心算法的局限性贪心算法的优化与变种总结 贪心算法简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一…

10天速通Tkinter库——Day7:主菜单及图鉴

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验室主菜单、基础植物图鉴、杂交植物图鉴、杂交植物更多信息四个页面的制作。 它们作为主窗口的子页面实例&#xff0c;除了继承主窗口的基础设置&#xff08;如图标、标题、尺寸等等&#xff09;、还可以使用主窗…

使用C++开发黑神话悟空类似3A如何避免内存泄漏

智能指针&#xff1a;使用C11或更高版本中的智能指针&#xff08;如std::unique_ptr、std::shared_ptr和std::weak_ptr&#xff09;来自动管理内存。这些智能指针在超出作用域时会自动释放它们所管理的内存。 RAII&#xff08;Resource Acquisition Is Initialization&#xf…

Java开发程序员职业发展路径

入行阶段&#xff1a;后端 3年 目标 在这一阶段&#xff0c;你将专注于后端开发&#xff0c;特别是Java编程语言及其相关技术栈。 主要任务和技能 掌握Java基础: 理解Java语言的核心概念&#xff0c;如OOP&#xff08;面向对象编程&#xff09;、数据结构、算法等。学习后端…

【Rust练习】10.元组

练习题来自&#xff1a;https://practice-zh.course.rs/compound-types/tuple.html 1 元组中的元素可以是不同的类型。元组的类型签名是 (T1, T2, …), 这里 T1, T2 是相对应的元组成员的类型. fn main() {let _t0: (u8,i16) (0, -1);// 元组的成员还可以是一个元组let _t1:…

相关性分析

斯皮尔曼、皮尔逊、肯德尔、点双列相关分析、偏相关分析、距离相关分析、双变量回归分析和互信息。 特性斯皮尔曼相关分析&#xff08;Spearman Correlation&#xff09;皮尔逊相关分析&#xff08;Pearson Correlation&#xff09;肯德尔相关分析&#xff08;Kendall’s Tau&…

华为OD题目 csv格式的数据 字符串 用C没写出来

这题对于嵌入式mcu的人来说&#xff0c;太难为了。不想解了&#xff0c;烂摆。有心情再说把。 将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。 Comma seprated values&#xff08;CSV&#xff09;逗号分隔值&#xff0c;csv格式的数据文件使用…

nodemon学习(一)简介、安装、配置、使用

nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。以前&#xff0c;我们开发一个node后端服务时&#xff0c;每次更改文件&#xff0c;均需重启一下&#xff0c;服务才能生效。这使我们的开发效率降低了很多。nodemon的出现&#xff0c;可以…

Catf1ag CTF Crypto(六)

前言 Catf1agCTF 是一个面向所有CTF&#xff08;Capture The Flag&#xff09;爱好者的综合训练平台&#xff0c;尤其适合新手学习和提升技能 。该平台由catf1ag团队打造&#xff0c;拥有超过200个原创题目&#xff0c;题目设计注重知识点的掌握&#xff0c;旨在帮助新手掌握C…

ffmpeg.exe命令行常见应用

基本转换&#xff1a; ffmpeg -i input.mp4 output.avi将input.mp4文件转换为output.avi文件。 提取音频&#xff1a; ffmpeg -i input.mp4 -vn output.mp3从input.mp4文件中提取音频并保存为output.mp3文件。 视频剪辑&#xff1a; ffmpeg -i input.mp4 -ss 00:00:30 -t 00:…

深入探讨Java多线程

我的主页&#xff1a;2的n次方_ 1. 多线程的概念 多线程是指在同一个程序中同时执行多个线程的技术。线程是操作系统能够独立调度和执行的最小单位。在Java中&#xff0c;线程由Thread类来表示&#xff0c;所有的线程都是通过这个类或其子类来创建和控制的。通过合理的多线…

codetop标签动态规划大全C++讲解(上)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o

主要供自己回顾学习&#xff0c;会持续更新&#xff0c;题源codetop动态规划近半年 1.零钱兑换2.零钱兑换II3.面试题08.11.硬币4.单词拆分5.最长递增子序列6.最长递增子序列的个数7.得到山形数组的最少删除次数8.最长公共子序列9.最长重复子数组10.最长等差数列11.最大子数组和…

Docker数据卷使用手册

目录 目标 前言 概念 官方文档 匿名卷&#xff08;Anonymous Volumes&#xff09; 简介 案例 命名卷&#xff08;Named Volumes&#xff09; 简介 案例 目标 掌握Volume命令通过演示案例&#xff0c;理解数据卷种类与各自的用途。 前言 我们在很多网上教程上可以看到…

前端宝典十:webpack性能优化最佳实践

Webpack 内置了很多功能。 通常你可用如下经验去判断如何配置 Webpack&#xff1a; 想让源文件加入到构建流程中去被 Webpack 控制&#xff0c;配置 entry&#xff1b;想自定义输出文件的位置和名称&#xff0c;配置 output&#xff1b;想自定义寻找依赖模块时的策略&#xff…

云计算day31

⼀、Docker 1、Docker介绍.pdf 1、Docker 是什么&#xff1f; Docker 是⼀个开源的应⽤容器引擎&#xff0c;可以实现虚拟化&#xff0c;完全采⽤“沙 盒”机制&#xff0c;容器之间不会存在任何接⼝。 Docker 通过 Linux Container&#xff08;容器&#xff09;技术将任意…

如何在Docker中部署Eureka Server:容器化微服务注册中心

在现代微服务架构中&#xff0c;服务注册和发现是至关重要的。Eureka Server 是一个由 Netflix 开发的开源服务注册和发现工具&#xff0c;它允许微服务实例在运行时动态地注册和查询其他服务。将 Eureka Server 部署在 Docker 中可以提高其可移植性和可维护性&#xff0c;同时…

Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱

Django 后端架构开发&#xff1a;手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱接入 &#x1f31f; 手机短信与邮箱短信验证码的应用场景 在现代应用中&#xff0c;短信和邮箱验证码是用户验证和安全管理的关键组成部分。它们广泛应用于注册、登录、找回密码等场景&#xf…