操作系统之死锁详解

news2024/11/18 7:30:42
本文已收录于专栏
《自考》

目录

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

背景介绍

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

死锁的前提

  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,则不会发生死锁。因此,死锁是一个非确定性的问题,需要通过合理的资源分配和调度策略来避免。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习——手写数据集的介绍以及案例讲解

系列文章目录 机器学习聚类——DBSCAN(Density-based spatial clustering of applications with noise,基于密度的聚类算法) 机器学习集成学习——Adaboost分离器算法 机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法 机器学习的…

“交通·未来”第27期:基于随机效应机器学习的多区域居民出行模式选择分析...

2020年6月份,公众号正式推出了“交通未来”系列线上公益学术活动等你来~, 2023年,新起航新征程,我们继续前行~ 6月24日下午15:30,我们将迎来活动的第27期。 1、讲座主题 基于随机效应机器学习的多区域居民出行模式选择…

工作三--知识点

1、split 切割字符串 2、includes 而不是写成 if(useContext pm_global_teamrole_project_manager || pm_global_teamrole_task_manager || pm_global_teamrole_task_parent_manager) 因为 的 优先级 高于 ||,这样写 只能 前面的&…

大数据学习(3)

大数据学习(3) 1 Hive-SQL-DML语句1.1 Hive SQL Load 加载数据语句1.1.1 Load功能1.1.2 Load语法规则1.1.3 Load 语法实验1.1.3.1 Load Data From Local FS1.1.3.2 Load Data From HDFS1.1.3.3 Overwrite选项 1.2 Hive SQL Insert 插入数据语句1.3 Hive …

河道垃圾自动识别监测算法 opencv

河道垃圾自动识别监测系统通过pythonopencv网络模型技术,河道垃圾自动识别监测算法对水面上的垃圾进行自动识别,一旦发现垃圾污染将自动发出警报。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python…

Win10文件夹选项在哪里打开?Win10文件夹选项打开方法

Win10文件夹选项在哪里打开?Win10电脑中用户不知道在哪里才能打开文件夹选项,这时候用户随意打开Win10电脑上的一个文件夹,然后点击右上角的选项,打开之后就能打开文件夹选项了,也可以打开电脑的运行窗口,在…

自动化漏洞猎人代码分析

0x00 前言 安全人员可以扫描,网络上悬赏网站等的漏洞,如果能够发现其存在着安全漏洞,则可以通过提交漏洞的方式来获得一定的赏金,国外的这类悬赏的网站比较多,比如hackone,这上面列出了大量的资产信息&…

你不得不知道的箭头函数和普通函数使用区别!

前言 箭头函数是 ES6 新增的一种函数类型,它采用箭头 > 定义函数,也称为 lambda 函数。箭头函数语法更为简洁,用起来很是方便顺手。 但它存在一些需要注意的问题和局限性。在实际使用时,我们需要根据具体情况来选择合适的函数…

【夜深人静学数据结构与算法 | 第九篇】栈与队列

目录 ​前言: 栈: 栈的实际应用: 队列: 队列的实际应用: 总结: 前言: 栈与队列是我们学习的两个经典的数据结构,这两个数据结构应用广泛,在计算机内有很多底层应用…

操作系统2——进程的描述与控制

本系列博客重点在深圳大学操作系统课程的核心内容梳理,参考书目《计算机操作系统》(有问题欢迎在评论区讨论指出,或直接私信联系我)。 梗概 本篇博客主要介绍操作系统第二章进程的描述与控制的相关知识。 目录 一、前驱图与程序…

大数据从0到1的完美落地之Flume案例1

案例演示 案例演示:AvroMemoryLogger Avro Source:监听一个指定的Avro端口,通过Avro端口可以获取到Avro client发送过来的文件,即只要应用程序通过Avro端口发送文件,source组件就可以获取到该文件中的内容,输出位置为…

数据库详细讲解--下

数据库详细讲解–下 mysql 表外连接 外连接 1.左外连接(如果左侧的表完全显示我们就说是左外连接) 2.右外连接(如果右侧的表完全显示我们就说是右外连接) 3.使用左连接(显示所有人的成绩,如果没有成绩…

4自由度并联机器狗实现行走功能

1. 功能说明 本文示例将实现R328a样机4自由度并联机器狗行走的功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂电池 …

【Linux】进程优先级 进程切换 环境变量

目录 一、进程优先级 1、优先级概念 2、优先级特点 3、修改Linux下的优先级 二、进程切换 1、进程特性 2、进程切换 三、环境变量 1、基本概念 2、常见环境变量 3、查看环境变量方法 4、PATH环境变量 5、和环境变量相关的命令 6、环境变量的组织方式 7、通过代码如何获取环境…

io.netty学习(十一)Reactor 模型

目录 前言 传统服务的设计模型 NIO 分发模型 Reactor 模型 1、Reactor 处理请求的流程 2、Reactor 三种角色 单Reactor 单线程模型 1、消息处理流程 2、缺点 单Reactor 多线程模型 1、消息处理流程 2、缺点 主从Reactor 多线程模型 主从Reactor 多线程模型示例 1…

索尼笔记本U盘重装Win10系统教程图解

很多使用索尼笔记本的用户想要给笔记本重装一下Win10系统,但不清楚具体要怎么操作,首先用户需要确保自己的索尼笔记本电脑能够正常联网,还需要准备一个8G以上的U盘,接着按照小编分享的索尼笔记本U盘重装Win10系统教程图解操作&…

怎么高效的通过爬虫获取数据

导语:在当今数字化时代中,获取数据已成为许多企业和个人的重要需求。在快速获取数据时,通过爬虫技术迅速获取网络数据已成为一项重要的技能和技术。然而,在应用爬虫技术前,需要注意一些重要的问题。本文总结了从数据来…

九大数据结构

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 常用的数据结…

IDEA上面书写wordcount的Scala文件具体操作

系列文章目录 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala 目录 系列文章目录 1、编写Scala程序 2、更换pom.xml文件 3、更新Maven的依赖文件 4、执行代码即可 总结 前言 本文主要在上述文章的基础上编辑和创建一个WordCount应…

Linux常用命令——ftp命令

在线Linux命令查询工具 ftp 用来设置文件系统相关功能 补充说明 ftp命令用来设置文件系统相关功能。ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令…