当前位置: 首页 > news >正文

操作系统基础:死锁

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:OS从基础到进阶


  • 🐦1 死锁的概念
    • 🦢1.1 总览
    • 🦢1.2 什么是死锁
    • 🦢1.3 死锁、饥饿、死循环的区别
      • 🐧1.3.1 概念
      • 🐧1.3.2 区别
    • 🦢1.4 死锁产生的必要条件
      • 🐧1.4.1 互斥条件
      • 🐧1.4.2 不剥夺条件
      • 🐧1.4.3 请求和保持
      • 🐧1.4.4 循环等待
    • 🦢1.5 什么时候会发生死锁
    • 🦢1.6 死锁的处理策略
    • 🦢1.7 总结
  • 🐦2 死锁的处理策略——预防死锁
    • 🦃2.1 总览
    • 🦃2.2 破坏互斥条件
      • 🦆2.2.1 什么是互斥条件?
      • 🦆2.2.1 如何破坏?
      • 🦆2.2.3 缺点
    • 🦃2.3 破坏不剥夺条件
      • 🦆2.3.1 什么是不剥夺条件
      • 🦆2.3.2 如何破坏不剥夺条件
      • 🦆2.3.3 缺点
    • 🦃2.4 破坏请求和保持条件
      • 🦆2.4.1 解释
      • 🦆2.4.2 如何破坏
      • 🦆2.4.3 缺点
    • 🦃2.5 破坏循环等待条件
      • 🦆2.5.1 解释
      • 🦆2.5.2 如何破坏
      • 🦆2.5.3 缺点
    • 🦃2.6 总结
  • 🐦3 死锁的处理策略——避免死锁
    • 🦅3.1 总览
    • 🦅3.2 安全序列
    • 🦅3.3 不安全状态
    • 🦅3.4 银行家算法
      • 🦉3.4.1 定义以下变量
      • 🦉3.4.2 银行家算法的步骤
  • 🐦4 死锁的检测和解除
    • 🦩4.1 总览
    • 🦩4.2 死锁的检测
      • 🦚4.2.1 检测死锁的前提条件
      • 🦚4.2.2 数据结构
      • 🦚4.2.3 检测算法
    • 🦩4.3 死锁的解除
      • 🦚4.3.1 解除死锁的办法
      • 🦚4.3.2 进程撤销根据
    • 🦩4.4 总结
  • 🕮 5 总结


🐦1 死锁的概念

🦢1.1 总览

image1

🦢1.2 什么是死锁

image2

🦢1.3 死锁、饥饿、死循环的区别

🐧1.3.1 概念

image3

🐧1.3.2 区别

image4

🦢1.4 死锁产生的必要条件

死锁的产生必须满足以下四个基本条件

🐧1.4.1 互斥条件

image5

🐧1.4.2 不剥夺条件

image6

🐧1.4.3 请求和保持

image7

🐧1.4.4 循环等待

image8

可以类比于哲学家问题的死锁情况,如图
image9
注意:
image10
假如在上图的哲学家问题中,有第六个哲学家手里有筷子,那么意味着同类资源数大于1,只要第六个哲学家提供筷子就可以解决死锁的局面。

🦢1.5 什么时候会发生死锁

image11

🦢1.6 死锁的处理策略

image12

🦢1.7 总结

image13

🐦2 死锁的处理策略——预防死锁

🦃2.1 总览

image1
死锁只有在上述四个条件全部满足时才会产生,因此只要破坏其中的任何一个就可以避免死锁。

🦃2.2 破坏互斥条件

🦆2.2.1 什么是互斥条件?

image2

🦆2.2.1 如何破坏?

当存在互斥条件时,比如说对打印机的使用是互斥的,则可能会出现阻塞的情况:
image3

为此可以采用SPOOLing技术,将互斥资源在逻辑上打造成为共享资源。对于上述情况,可以增加一个缓冲空间,它接收了来自进程对打印机的使用请求,并将请求存储起来,一个一个的实现,如图:
image4

image5

🦆2.2.3 缺点

image6

🦃2.3 破坏不剥夺条件

🦆2.3.1 什么是不剥夺条件

image7

🦆2.3.2 如何破坏不剥夺条件

image8

🦆2.3.3 缺点

image9

🦃2.4 破坏请求和保持条件

🦆2.4.1 解释

image10

🦆2.4.2 如何破坏

image11

🦆2.4.3 缺点

image12
例如,假如现在有A、B、C三类进程,A需要资源1,B需要资源2,C需要资源1、2。假如源源不断的有A、B类进程申请资源,则C类进程始终等不到资源1、2空闲的时候,就会造成饥饿。
image13

🦃2.5 破坏循环等待条件

🦆2.5.1 解释

image14

🦆2.5.2 如何破坏

image15

🦆2.5.3 缺点

image16

🦃2.6 总结

image17

🐦3 死锁的处理策略——避免死锁

🦅3.1 总览

image1

🦅3.2 安全序列

image2

🦅3.3 不安全状态

image3

🦅3.4 银行家算法

假设此时共有n个进程,m种资源

🦉3.4.1 定义以下变量

(1)可用资源向量available[m]:记录第m种资源当前可利用的数量
(2)最大需求向量max[i][j]:记录第i个进程对第j种资源的最大需求量
(3)分配矩阵allocation[i][j]:记录第i个进程拥有第j种资源的数量
(4)请求向量request[i][j]:记录第i个进程对第j种资源的申请量
(5)需求矩阵need[i][j]:记录第i个矩阵第第j种资源的需求量。等于分配矩阵与分配矩阵的差值

🦉3.4.2 银行家算法的步骤

image4
第④步的安全性检查的步骤为
image5

🐦4 死锁的检测和解除

🦩4.1 总览

image1

🦩4.2 死锁的检测

🦚4.2.1 检测死锁的前提条件

image2

🦚4.2.2 数据结构

定义以下符号
image3
具体如图所示
image4

🦚4.2.3 检测算法

(1)关于可完全简化
image5

(2)算法内容
image6

(3)具体实现解释
①无死锁
在示意图中,R1此时的资源数量为0,而R2此时的资源数量为1,而P1像R2申请的资源数为1,小于等于剩余的资源数,故抹去P1。
之后,R1剩余资源数为2,P2申请资源数为1,可以满足,因此不会发生死锁。
②有死锁
image7
这是一个典型的死锁图,P1申请R1,R1分配给了P2,P2申请R2,R2分配给了P3,P3申请R3,R3分配给了P1、P2。三者都在等待对方释放资源,导致了死锁情况。
事实上,本图找不到既不堵塞又不孤立的进程。检测算法不能继续。

(4)补充
image8

🦩4.3 死锁的解除

🦚4.3.1 解除死锁的办法

image9

🦚4.3.2 进程撤销根据

①进程优先级:优先级越高的自然越不应该被首先撤销

②还要多久才可以完成:显然,进程完成所需时间越短,它就越不应该被首先撤销,应该撤销那些还要很久才可以完成的进程

③已执行多长时间:撤销执行时间越长的进程,那么意味着之后还要花更长的时间去完成,系统付出的代价也越大。所以,执行时间越短的进程应该被首先撤销。

④进程已经使用了多少资源。一个进程所拥有资源的数量越多,撤销它而彻底解除死锁局面的可能性就越大,就更应该被首先撤销。

⑤进程是交互式的还是批处理式的。撤销交互式的进程对于用户的体验可能不是很好,因此应首先撤销批处理式的进程

🦩4.4 总结

image10

🕮 5 总结

操作系统,如默默守护的守夜者,无声地管理硬件与软件的交流,为计算机创造和谐秩序。

它是无形的引导者,让复杂的任务变得井然有序,为用户提供无忧体验。

操作系统的巧妙设计,让计算机变得更加智能高效,让人与科技之间的交流更加顺畅。

在每一次启动中,它如信任的伙伴,带领我们进入数字世界的奇妙旅程。

渴望挑战操作系统的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多操作系统的奇迹吧。我们推出了引领趋势的💻OS专栏:《OS从基础到进阶》 ,旨在深度探索OS的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

相关文章:

操作系统基础:死锁

🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 🐦1 死锁的概念🦢1.1 总览🦢1.2 什么是死锁🦢1.3 死锁、饥饿、死循环的区别🐧1.3.1 概念🐧1.3.2 区别…...

Ubuntu server如何使用 Daphne + Nginx + supervisor部署 Django

Django从 3.0版开始加入对ASGI的支持,使Django开始具有异步功能。 截止目前的5.0版,对异步支持逐步也越来越好,相信在未来的版本中异步将会支持的更加完善。 所以说,我们也需要适时的更新我们的技能,学会在asgi异步服务器环境中部署django项目! 在部署之前我们所有的依…...

Android 12.0 应用中监听系统收到的通知

1. 需求 在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容. 2. NotificationListenerService 接口 Android 系统预留了专门的API, 即 NotificationListenerService 接口,它的源码路径为: 源码路径 : /frameworks/base/core/java/android/service/notifi…...

SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)

点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录(含源码)》 1. 引言 在当今的网络环境中,保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击,我们需要在用户尝试登录失败一定次数后限制其登录。这不…...

kotlin中的初始化问题纪录

1. init 代码块的顺序问题 init代码块和成员变量实质上是按先后顺序执行的。若果init{} 中有成员变量使用。要把成员变量放到代码块之前。 2. init代码块之中的函数问题 下面是一段错误的代码: class mkotlin{val info:Stringinit {getInfoMethod()info "adad…...

Web中的转发与重定向

转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一…...

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型

目录 往期精彩内容: 前言 1 快速傅里叶变换FFT原理介绍 第一步,导入部分数据 第二步,故障信号可视化 第三步,故障信号经过FFT可视化 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 交叉注意力机制 …...

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机) 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM?②STM32F103C8T6如何生成PWM?③控制舵机需要什么样的PWM波? 三…...

Unity_Playable工具使用

Unity_Playable工具使用 目录 Unity_Playable工具使用 1. Default Playables(Timeline扩展) 2. PlayableGraph Visualizer&#x...

Flutter canvas 画一条波浪线 进度条

之前用 Flutter Canvas 画过一个三角三角形,html 的 Canvas 也画过一次类似的, 今天用 Flutter Canvas 试了下 感觉差不多: html 版本 大致效果如下: 思路和 html 实现的类似: 也就是找出点的位置,使用二阶…...

Java技术栈 —— Spring MVC 与 Spring Boot

参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC...

跟着cherno手搓游戏引擎【16】Camera和Uniform变量的封装

相机封装&#xff1a; OrthographicCamera.h: #pragma once #include <glm/glm.hpp> namespace YOTO {class OrthographicCamera{public:OrthographicCamera(float left,float right , float bottom,float top);const glm::vec3& GetPosition()const { return m_Pos…...

微服务中间件 RabbitMq学习

1、为什么需要Mq 例如在用户注册业务中&#xff0c;用户注册成功后 需要发注册邮件和注册短信&#xff0c;传统的做法有两种 1.串行的方式&#xff1b;2.并行的方式 &#xff1b; 假设三个业务节点分别使用50ms&#xff0c;串行方式使用时间150ms&#xff0c;并行使用时间10…...

3D Gaussian Splatting-实时辐射场渲染技术

引用自&#xff1a;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf 概述&#xff1a; 该论文介绍了一种用于实时辐射场渲染的3D高斯点渲染技术。 其基本原理是&#xff1a; 一&#xff1a;首先从SfM校准的图像及其对应的稀疏点云…...

vue中nextTick()

在 Vue.js 中&#xff0c;nextTick() 是一个非常有用的方法&#xff0c;用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码&#xff0c;用于解析 nextTick() 的用法&#xff1a; <template> &…...

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…...

中国的茶文化:现代生活中的茶文化

中国的茶文化&#xff1a;现代生活中的茶文化 引言 在现代社会的快节奏生活中&#xff0c;茶文化并未随时间流逝而褪色&#xff0c;反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴&#xff0c;成为一种连接历史、人文与现代生活方式的艺术形式。本文…...

Python正则表达式语法

正则表达式是一种强大的文本处理工具&#xff0c;它可以用来搜索、匹配和替换特定的字符模式。在Python中&#xff0c;正则表达式常常被用于处理字符串数据&#xff0c;例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法&#xff0c;帮助读者全…...

C++核心编程:文件操作 笔记

5.文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦允许结束都会被释放。通过文件可以将数据持久化 C中对文件操作需要包含头文件<fstream> 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本…...

ElementUI组件:Button 按钮

ElementUI安装与使用指南 Button按钮 点击下载learnelementuispringboot项目源码 效果图 el-button.vue页面效果图 项目里el-button.vue代码 <script> export default {name: "el_button",// 注意这里的名称不能和 router inex.js里的name一样methods: {s…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...