操作系统之死锁详解

这篇具有很好参考价值的文章主要介绍了操作系统之死锁详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

背景介绍

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

死锁的前提

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

文章来源地址https://www.toymoban.com/news/detail-500150.html

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

到了这里,关于操作系统之死锁详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统-进程和线程-同步、互斥、死锁

    目录 一、同步互斥  二、互斥的实现方法 2.1软件实现 2.1.1单标志法 2.1.2双标志先检查 2.1.3双标志后检查 2.1.4Petersons算法 2.2硬件实现 2.2.1 TestAndSet指令 2.2.2 Swap指令   三、信号量机制 3.1整形变量  3.2 记录型变量  3.3用信号量实现进程互斥、同步、前驱关系 3.3.1互斥  3.3.2同步

    2024年02月08日
    浏览(49)
  • 操作系统进程线程(三)—进程状态、同步互斥、锁、死锁

    原子操作的概念 原子操作就是不可中断的一个或者一系列操作。 原子操作如何实现 总线锁定 使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号的时候,其他处理器的请求将被阻塞住,那么该处理器可以独占内存。 缓存锁 总线锁开销比较大,因为把CPU和内

    2024年02月04日
    浏览(48)
  • 操作系统实验二死锁避免之银行家算法的模拟

    死锁  (1)定义  (2)死锁产生的原因  (3)死锁产生的必要条件  (4)死锁的处理策略 银行家算法  (1)核心思想  (2)数据结构  (3)算法描述    (4)  安全性检查算法 银行家算法的模拟 (1)数据结构 (2)完整代码 (3)测试 所谓死锁,是指多个进程因为竞争资

    2024年02月01日
    浏览(60)
  • 【第三章 | 处理机调度与死锁】《操作系统 慕课版》课后答案 + 复习

    目录 【第三章】处理机调度与死锁 | 本章概念 1.处理机调度概述 2.调度算法相关概念 3.实时调度相关概念 4.死锁 5.资源分配图 | 本章算法 1.周转时间与带权周转时间的计算公式 2.调度算法 FCFS  SJF  PR  RR 3.实时调度算法 EDF 4.避免死锁 —— 银行家算法 | 课后简答题 1.处理机调

    2024年02月01日
    浏览(45)
  • Linux操作系统详解

    Linux是一个开源的Unix-like操作系统。它是由芬兰计算机科学家Linus Torvalds于1991年首次发布。Linux以其稳定性,安全性和灵活性而受到欢迎,并被广泛用于服务器,超级计算机,嵌入式系统和许多其他平台。在某些领域,例如智能手机和平板电脑(主要是Android操作系统),Linu

    2024年02月12日
    浏览(36)
  • Linux——操作系统详解

    目录 一.操作系统的含义 1.操作系统是什么? 2.那么操作系统为什么要对软硬件资源进行管理呢?这样做的好处在哪里? 3.操作系统又是怎么进行管理的? 如何理解“先描述,再组织”? 二.总结: 示例1: 通过操作系统图映射银行管理 三.操作系统存在的意义 1.操作系统是什

    2024年02月06日
    浏览(34)
  • Linux操作系统——文件详解

    首先,当我们在磁盘创建一个空文件时,这个文件会不会占据磁盘空间呢? 答案是当然会占据磁盘空间了,因为文件是空的,仅仅指的是它的内容是空的,但是该文件要有对应的文件名,文件的大小,文件的创建时间,文件的权限等等,这些叫做文件的属性,是一个往往被人

    2024年01月16日
    浏览(43)
  • Linux操作系统详解(最详细)

    一. linux操作系统的基本介绍 ​ Linux是一套免费使用和自由传播的类unix操作系统。那么什么是类unix操作系统呢?在1969年由unix之父Ken Thompson在ATT(American Telephone Telegraph, 美国电话电报公司,现在为美国第二大运营商,第一大运营商为 Verizon Wireless)的贝尔实验室主导研发的,当时

    2024年02月10日
    浏览(40)
  • 操作系统进程定义和PCB详解

       进程的定义和PCB       什么是进程?进程就是一个运行起来(也就是说加载到内存)的一个程序。而程序的本质就是文件,当我们写完代码保存,它便形成了一个保存在磁盘上的二进制代码文件。由于冯诺伊曼体系,cpu只和存储进行数据交流,因此要想cpu执行,必须先将

    2024年01月16日
    浏览(39)
  • Linux 操作系统和C语言(详解)

    1、操作系统 定义:本质是运行在计算机上的软件程序 组成:内核 + 外壳(图形化界面+软件工具...) 作用:向用户提供操作接口,管理计算机硬件和软件资源。 主流操作系统有Windows、 MacOS、 Linux 2、GNU/Linux Linux1.0 1.Linux又称为类Unix操作系统 Minux 2.Linux的特点免费、开源、可

    2023年04月27日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包