操作系统之死锁详解

本文已收录于专栏
《自考》

目录

  • 背景介绍
  • 死锁的前提
  • 死锁的概念
  • 死锁的分类
  • 死锁的产生
    • 原因
    • 条件
  • 死锁的解决
    • 预防
    • 避免
    • 检测与恢复
  • 死锁的实现
  • 总结提升

背景介绍

  最近一直在做操作系统的测试题,在做题的过程中发现有很多地方涉及到了关于死锁的知识点。今天就回归课本来自己琢磨一下死锁。下面就把我琢磨的成果分享给大家。

死锁的前提

  1. 并发编程:死锁是在并发环境下发生的,因此了解并发编程的基本概念和机制是理解死锁的前提。包括多线程、多进程、资源竞争等概念。
  2. 资源竞争:死锁是由于资源竞争而产生的,因此了解资源的概念和不同类型的资源是理解死锁的前提。包括共享资源和独占资源等。
    在这里插入图片描述

死锁的概念

  死锁是指在并发环境中,两个或多个进程或线程因为竞争有限的资源而无法继续执行的状态。这种状态下,每个进程或线程都在等待其他进程或线程所持有的资源,形成了一个相互等待的循环。
在这里插入图片描述

死锁的分类

  死锁可以分为资源死锁和进程死锁。资源死锁是指多个进程或线程竞争有限的资源而导致的死锁,而进程死锁是指多个进程之间因为相互等待对方释放资源而导致的死锁。

死锁的产生

原因

竞争共享资源的同时分配资源的顺序不当

条件

  • 「 互斥条件 」:指一个进程在访问资源的过程中,其他进程不能访问该资源。如果一个资源正在被访问时,有其他进程也提出对该资源的访问请求,必须把请求该资源的 进程阻塞起来,直到资源被进程释放 。
  • 「 请求和保持条件」:进程已经保持了至少一个资源,又提出了新的资源要求,而新的请求已经被其他进程占有,此时进程阻塞,但有对已经获得的资源保持不放,使得其他进程无法使用被保持的资源。
  • 「不剥夺条件 」:进程已经获得的资源不能被剥夺,只能由进程自己释放。
  • 「 环路等待条件 」:在发生死锁时,必然存在一个进程申请资源的环形链。

在这里插入图片描述

  1. 每个资源类用一个方框表示,方框中的原点表示此资源类中的各个资源;
  2. 每个进程用一个圆圈来表示,用有向边表示进程申请资源和资源分配情况。
  3. 约定方框→圆圈表示资源分配,圆圈→方框表示申请资源。
  4. 这种情况下,图3-6 发生了死锁,而图3-7没有发生死锁。

死锁的解决

预防

  死锁预防是通过破坏死锁产生的四个条件来避免死锁的发生。常见的预防措施包括资源分配策略、资源的有序分配、避免占有并等待、资源剥夺和循环等待的预防。

避免

  死锁避免是在资源分配过程中,通过动态地检测和避免可能导致死锁的资源分配序列,来避免死锁的发生。常见的避免方法包括安全序列算法、银行家算法和资源分配图算法。死锁的避免是把系统的资源分配状态分为安全状态和不安全状态,只要资源分配使系统资源分配状态处于安全状态,死锁就不会发生死锁。

  1.安全状态:系统按照顺序为每个进程分配资源,确保每个进程的资源分配和执行顺利完成,不会发生死锁时,称系统处于安全状态。

  2.不安全状态:系统不存在安全状态这样的安全序列,则是不安全状态,不安全状态不一定是死锁状态。但是可能会发生死锁状态。

检测与恢复

  死锁检测是通过周期性地检测系统资源分配情况,来判断系统是否发生死锁。一旦检测到死锁,可以采取恢复措施,如剥夺资源、回滚进程或线程等。

死锁的实现

import threading

# 创建两个资源
resource1 = threading.Lock()
resource2 = threading.Lock()

# 线程1的执行函数
def thread1_func():
    print("Thread 1: Acquiring resource 1")
    resource1.acquire()
    print("Thread 1: Acquired resource 1")
    
    print("Thread 1: Acquiring resource 2")
    resource2.acquire()
    print("Thread 1: Acquired resource 2")
    
    # 执行一些操作...
    
    resource2.release()
    print("Thread 1: Released resource 2")
    
    resource1.release()
    print("Thread 1: Released resource 1")

# 线程2的执行函数
def thread2_func():
    print("Thread 2: Acquiring resource 2")
    resource2.acquire()
    print("Thread 2: Acquired resource 2")
    
    print("Thread 2: Acquiring resource 1")
    resource1.acquire()
    print("Thread 2: Acquired resource 1")
    
    # 执行一些操作...
    
    resource1.release()
    print("Thread 2: Released resource 1")
    
    resource2.release()
    print("Thread 2: Released resource 2")

# 创建两个线程
thread1 = threading.Thread(target=thread1_func)
thread2 = threading.Thread(target=thread2_func)

# 启动线程
thread1.start()
thread2.start()

# 等待线程执行完毕
thread1.join()
thread2.join()

  在上述代码中,我们创建了两个资源 resource1 和 resource2,并在两个线程中分别获取这两个资源。然而,线程1首先获取了 resource1,然后尝试获取 resource2,而线程2则相反,首先获取了 resource2,然后尝试获取 resource1。由于资源的互斥条件,线程1无法继续执行直到释放 resource2,而线程2也无法继续执行直到释放 resource1,从而形成了一个死锁的情况。

总结提升

  操作系统死锁是指在并发环境下,由于资源竞争而导致的进程或线程无法继续执行的状态。死锁的产生需要满足一定的条件,可以通过预防、避免、检测和解决等策略来处理死锁问题。了解和掌握死锁相关知识对于设计和优化并发系统非常重要。
  需要注意的是,死锁并不是必然发生的,它取决于资源的获取顺序和调度器的调度策略。在上述代码中,如果线程1先获取 resource2,线程2先获取 resource1,则不会发生死锁。因此,死锁是一个非确定性的问题,需要通过合理的资源分配和调度策略来避免。

🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

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

相关文章

哈工大计算机网络课程网络层协议详解之:网络地址转换NAT

哈工大计算机网络课程网络层协议详解之:网络地址转换NAT 文章目录 哈工大计算机网络课程网络层协议详解之:网络地址转换NAT网络地址转换(NAT)NAT实现原理NAT穿透问题NAT穿透问题的解决方案 上一节中,我们在DHCP协议中介…

【人脸检测——基于机器学习4】HOG特征

前言 HOG特征的全称是Histograms of Oriented Gradients,基于HOG特征的人脸识别算法主要包括HOG特征提取和目标检测,该算法的流程图如下图所示。本文主要讲HOG特征提取。 HOG特征的组成 Cell:将一幅图片划分为若干个cell(如上图绿色框所示),每个cell为8*8像素 Block:选…

【力扣刷题 | 第十四天】

目录 前言: 7. 整数反转 - 力扣(LeetCode) 面试题 16.05. 阶乘尾数 - 力扣(LeetCode) 总结; 前言: 今天仍然是无固定类型刷题, 7. 整数反转 - 力扣(LeetCode) 给你…

Android大图加载优化方案,避免程序OOM

我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如微博长图,海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

Redis入门(5)-set

Redis中set的元素具有无序性与不可重复性 1.sadd key member[member] 添加元素,若元素存在返回0若不存在则添加 sadd DB mysql oracle sadd DB mysql sadd DB db22.smembers key 查看set中所有元素 smembers DB3.sismember key member 判断元素在set中是否存…

GIS 功能模块实现

文章目录 1. GIS 模块流程图2. 网页端地图缓存的实现3. GIS 图形操作功能实现1 )地图漫游2 )对象删除3 )选择复制属性查看 GIS 基本功能模块主要是在表现层开发的,是在OpenLayers 开发框架提供的接口上,通过Geo Server…

智芯MCU软件开发环境搭建

智芯MCU软件开发环境搭建 目录 智芯MCU软件开发环境搭建前言1 软件安装2 编译环境3 烧录环境4 新建工程结束语 前言 智芯科技的MCU主要应用于汽车行业,属于车规级的MCU,目前上市的MCU型号较少,相关资料也不多,所以这里出一期开发…

uniapp实现tab切换可以滚动的效果

实现效果 当 tab 切换的内容很多时,需要用到滚动,希望在点击 tab 的时候可以自动滑动到对应的tab下 知识点 scrollIntoView:该scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域。 语法 element.scrollIntoView&#xff08…

【kubernetes】部署controller-manager与kube-scheduler

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

记录正式环境测试环境【RedHat7编译升级redis7.0.9】--有关报错及解决

记录正式环境&测试环境【RedHat7 编译升级redis7.0.9】--有关报错及解决 🔻 一、报错详情1.1 ⛳ 写在前面1.2 ⛳ 报错11.3 ⛳ 报错21.4 ⛳ 安装redis1.5 ⛳ 版本检查 🔻 二、⛳ 总结 🔻 一、报错详情 1.1 ⛳ 写在前面 🍁 升级…

王道计算机网络学习笔记(3)——数据链路层

前言 文章中的内容来自B站王道考研计算机网络课程,想要完整学习的可以到B站官方看完整版。 三:数据链路层 3.1:数据链路层功能概述 结点:主机、路由器 链路:网络中两个结点之间的物理通道,链路的传输介…

【DeepLearning】Ubuntu中深度学习环境配置完整流程

Ubuntu中深度学习环境配置完整流程 1 显卡驱动2 cuda3 cuDNN4 torch5 torchvision 1 显卡驱动 支持 cuda 的所有显卡型号: Link 查询显卡型号 lspci -nn | grep VGA即 Vendor ID:Device ID 为 10de:21c4,在浏览器或者 Link 中搜索。 填写显卡信息: Link 选择要下载…

数据结构——快速排序的介绍

快速排序 快速排序是霍尔(Hoare)于1962年提出的一种二叉树结构的交换排序方法。快速排序是一种常用的排序算法,其基本思想是通过选择一个元素作为"基准值",将待排序序列分割成两个子序列,其中一个子序列的元素都小于等于基准值&am…

SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

前言:在最近的工作当中,客户反应需要实时接收消息提醒,这个功能虽然不大,但不过也用到了一些新的技术,于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器,归纳到这篇博客中进行总结。 目录 …

【计算机网络自顶向下】计算机网络期末自测题(一)

前言 “(学不懂一点) (阴暗的爬行)(尖叫)(扭曲)(阴暗的爬行)(尖叫)(扭曲)(阴暗的爬行)(尖叫&#…

LeetCode·1262. 可被三整除的最大和·贪心

作者:小迅 链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2314049/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-r0n76/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得…

vscode 调试

目录 准备 GDB 调试方法 问题 准备 然后点击 文件-打开文件夹,找到创建的代码路径,确定后,在左侧的资源管理器可以看到代码文件。 第一次运行需要安装 c 的扩展,在扩展页面中,安装 C/C 编译注意一定要加上 -g 指令…

Linux tar.xz 格式的文件正确的解压命令

Linux tar.xz 最近下载 Linux kernel,好像最近流行 tar.xz 格式的后缀 对于 xz 后缀的压缩文件,我之前的解压方式是分为两步: xz -d xxx.tar.xz 解压成 xxx.tar 格式文件,然后再 tar xf xxx.tar 解压文件。 这样的操作不仅比较的…

跳槽过去,刚工作三天就被裁是一种怎样的体验

前言 还有谁?刚上三天班就被公司公司的工作不适合我,叫我先提升一下。 后面我也向公司那边讨要了一个说法,我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事在csdn上记录一下,一是记录一下自己的成长轨迹&#xff0…

使用STM32F103的串口实现IAP程序升级功能

使用STM32F103的串口实现IAP程序升级功能 🎬IAP程序烧录全过程演示: ✨这几天折腾IAP升级功能,狂补了很多相关BootLoader相关的知识。本来最想实现IAP升级程序的方式是,基于SPI通讯的SD卡,借助挂载的FatFS文件系统&am…