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

计算机操作系统(十五)死锁的概念与死锁的处理方法

计算机操作系统(十五)互斥锁,信号量机制与整型信号量

  • 前言
  • 一、死锁定义
    • 1. 什么是死锁?
    • 2. 用进程深入理解死锁
    • 3. 为什么会死锁?
  • 二、死锁出现的条件
    • 1. 死锁的四个必要条件
      • 1.1 互斥条件(资源独占)
      • 1.2. 不可剥夺条件(非抢占)
      • 1.3. 请求与保持条件(部分分配)
      • 1.4. 循环等待条件
    • 2. 为什么说死锁这四个条件缺一就不会发生死锁
  • 三、处理死锁的方法
    • 1. 死锁预防
      • 1.1 破坏互斥条件(难)
      • 1.2 破坏不可剥夺条件(部分可行)
      • 1.3 破坏请求与保持条件(常用但有缺点)
    • 2. 死锁避免
      • 2.1 安全状态与安全序列
    • 3. 死锁检测与死锁恢复
      • 3.1 死锁检测:
      • 3.2 死锁恢复
    • 4. 死锁忽略
    • 5. 四种策略对比表


前言

  • 在上一篇博客中,我们探讨了并发编程中互斥锁、信号量机制等重要同步机制,深入解析了信号量机制及其典型应用场景。
  • 本篇将聚焦于死锁这一并发编程中的关键问题,系统阐述死锁的核心概念与针对性处理方法

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的操作系统博客专栏
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482


一、死锁定义

1. 什么是死锁?

死锁就是“互相卡住,谁也动不了”的僵局

举个例子

你和张三面对面过一个狭窄的独木桥,你们都想先过,但谁也不退让。此时你们互相挡住对方,谁也没法前进——这就是“死锁”。

在计算机里,“死锁”发生在多个进程(程序的运行实例)争夺资源时,它们互相等待对方手里的资源,导致所有人都卡在原地,无法继续运行

2. 用进程深入理解死锁

假设计算机里有 2台打印机(A和B),两个进程P1和P2都想同时用这两台打印机。
在这里插入图片描述

  • 进程P1的操作顺序:

    1. 先拿走打印机A;
    2. 再想拿打印机B;
    3. 用完后先还B,再还A。
  • 进程P2的操作顺序:

    1. 先拿走打印机B;
    2. 再想拿打印机A;
    3. 用完后先还A,再还B。

死锁怎么发生的?

  1. P1拿走了A,同时 P2拿走了B
  2. P1现在需要B,但B在P2手里;
  3. P2现在需要A,但A在P1手里;
  4. 双方都在等对方释放资源,谁也动不了——这就是死锁!
  • 两个进程各自占着对方需要的资源,形成“循环等待”(P1等P2的B,P2等P1的A)。
  • 如果其中一个进程先释放资源,就不会死锁,但它们偏偏都“握死”资源不松手。

3. 为什么会死锁?

在这里插入图片描述

死锁的核心问题在于

多个进程以不同的顺序申请资源,导致循环等待

就像前面的独木桥例子:

  • 如果你和朋友都“先过一步,再让对方”,就会卡住;
  • 但如果你们约定“统一先让左边的人过,或右边的人退一步”,就不会死锁。

在计算机中,如果所有进程都按相同顺序申请资源(比如先申请打印机,再申请扫描仪),就不会出现循环等待,从而避免死锁。但如果顺序混乱,就可能触发死锁

二、死锁出现的条件

1. 死锁的四个必要条件

先记住一个核心逻辑:死锁的四个条件缺一不可,计算机里缺少一个条件都不可能形成死锁

1.1 互斥条件(资源独占)

含义:有些资源天生只能被一个人占用,不能共享。

  • 对应计算机:打印机、摄像头等设备,同一时间只能被一个进程使用。

  • 如果资源能共享,就不会触发死锁

1.2. 不可剥夺条件(非抢占)

含义:资源被占用后,不能被强制拿走,只能等对方主动释放。

  • 你向同学借了一支笔,同学不能直接从你手里抢走,必须等你用完还给他。
  • 对应计算机:进程申请到的内存、文件句柄等资源,系统不能强行剥夺,只能等进程自己释放。

反例:如果老师能强制没收同学的笔给你(可抢占),就不会死锁。

1.3. 请求与保持条件(部分分配)

含义:进程已经占用了一些资源,却还在申请其他资源,且不释放已有的资源。

  • 你手里已经拿着1支铅笔,却还想找同学借橡皮,结果同学手里有橡皮但想借你的铅笔。

  • 你不放下铅笔,同学不放下橡皮,双方都卡在“要借但不松手”的状态。

  • 对应计算机:进程P1占用了资源A,又申请资源B,没拿到B时也不释放A

  • 如果拿新资源前先放下已有资源(比如你先还铅笔再借橡皮),就不会卡住。

1.4. 循环等待条件

含义:多个进程形成一个环形链条,每个进程都在等下一个进程的资源。

  • 你(P1)拿着铅笔,等同学A(P2)的橡皮;

  • 同学A拿着橡皮,等同学B(P3)的尺子;

  • 同学B拿着尺子,等你的铅笔;

  • 三人形成“P1→P2→P3→P1”的循环等待环

  • 对应计算机:进程P1等P2的资源B,P2等P3的资源C,P3等P1的资源A。

  • 没有环就不会死锁,比如你等A的橡皮,A等B的尺子,但B不等任何人,就不会形成环。

2. 为什么说死锁这四个条件缺一就不会发生死锁

  1. 互斥条件不成立

若资源可被多个进程同时共享(如内存中的可重入代码),则不存在进程间对资源的独占需求。

  • 此时,进程无需竞争资源,自然不会因资源争夺陷入死锁
  1. 请求与保持条件不成立

若进程必须一次性申请所有所需资源(或在请求新资源时释放已持有资源),则不会出现“持有部分资源并等待其他资源”的状态。

  • 例如,进程启动前预分配所有资源,避免中间状态的资源持有与等待,破坏死锁的积累条件
  1. 不可剥夺条件不成立

若系统允许强制抢占资源(如优先级高的进程可抢占低优先级进程的资源),则当进程等待资源时,系统可从其他进程处夺回资源并分配给等待进程。

  • 这会打破“资源一旦分配就不可强制收回”的僵局,阻止死锁的形成
  1. 循环等待条件不成立

若系统采用资源有序分配策略(如为资源编号,进程只能按升序请求),则进程间无法形成资源请求的循环链。

  • 例如,进程A持有资源1并请求资源2,进程B持有资源2并请求资源1的环将被杜绝,直接消除死锁的结构基础

三、处理死锁的方法

1. 死锁预防

类比:在加油站贴“禁止吸烟”,直接消除火灾隐患。
核心思想破坏死锁的四个必要条件,让死锁根本无法发生

下面我们逐个讲解死锁预防四个条件的难易程度

1.1 破坏互斥条件(难)

  • 含义:让资源能共享使用,不独占。
    • 例子:打印机本是独占资源,但可以用“虚拟打印机”技术(如文件打印)让多个进程“共享”。
    • 局限:多数资源天生只能独占(如摄像头、扫描仪),无法破坏。

1.2 破坏不可剥夺条件(部分可行)

  • 含义:允许强制回收资源(类似老师强行没收文具)。
    • 例子
      • 进程占用的内存可以被系统强制释放(如进程崩溃时)。
      • 但打印机不行:打印到一半强制中断会导致纸张损坏。
    • 适用场景:仅适用于可“保存和恢复状态”的资源(如内存、CPU)。

1.3 破坏请求与保持条件(常用但有缺点)

  • 含义:进程必须一次性申请所有需要的资源,要么全拿到,要么全不拿(类似“一次借完所有文具”)。
    • 例子
      • 你想借铅笔和橡皮,必须同时申请这两样:
        • 如果有铅笔和橡皮,一起拿走;
        • 如果缺一样,就不拿任何东西,等下次再试。
    • 缺点
      1. 预知未来难:进程可能不知道自己未来需要什么资源(比如游戏程序无法提前知道要加载多少地图资源)。
      2. 资源浪费:借了铅笔后可能很久才用橡皮,铅笔闲置浪费。
      3. 进程卡住:很多进程因等全资源而无法启动,效率低。

2. 死锁避免

类比:煤气灶检测到煤气超标时,自动切断电源(预判风险,提前阻止)。
核心思想:在进程申请资源时,先预判是否会导致死锁,若会则拒绝请求。

2.1 安全状态与安全序列

  • 安全状态:系统能按某种顺序(安全序列)让所有进程都完成,不会死锁。
    • 类比:教室里有3支笔,2个同学A和B:
      • A需要2支笔,B需要1支笔;
      • 先给B分配1支(B用完归还),再给A分配2支——这是安全状态。
  • 不安全状态:无法找到安全序列,可能死锁。
    • 类比:A和B各需2支笔,总共有3支笔:
      • 若先给A 1支,B 1支,剩下1支,两人都在等对方的笔——不安全状态,可能死锁。

3. 死锁检测与死锁恢复

类比:房间装烟雾报警器,发现火灾时用灭火器灭火(先检测,再处理)。
核心思想

  1. 定期检测:隔一段时间检查系统是否出现死锁(如资源利用率突然变低时)。
  2. 恢复措施:发现死锁后,通过“终止进程”或“剥夺资源”打破僵局。

3.1 死锁检测:

  • 资源分配图:用箭头表示“进程申请资源”和“资源分配给进程”。
    在这里插入图片描述

    • 例子

      • P1→R1(P1申请R1),R2→P2(R2分配给P2)。
    • 判断死锁
      在这里插入图片描述

      • 如果图中存在“环”(如P1→R1→P2→R2→P1),说明可能死锁。
      • 单个资源类型有环:一定死锁(如两人互等同一把钥匙)。
      • 多个资源类型有环:可能死锁(需进一步判断是否循环等待)。

3.2 死锁恢复

  • 1. 终止进程:强制杀死某个或多个进程,释放它们的资源。

    • 选择标准
      • 优先杀优先级低的进程(如后台程序)。
      • 杀占用资源少的进程(减少损失)。
    • 类比:教室里两人死锁抢文具,老师直接没收其中一人的文具,让另一人先用。
  • 2. 剥夺资源:从进程手中强制拿走资源,分配给其他进程。

    • 需要“回滚”:被剥夺资源的进程需要回到之前的状态(如游戏存档,退回未申请资源时的状态)。
    • 类比:你借了铅笔和橡皮,老师强制拿走橡皮给同学,你需要回到“只借了铅笔”的状态。

4. 死锁忽略

类比:在太阳上不用怕火灾(因为环境不同,影响可忽略)。
核心思想:对死锁“睁一只眼闭一只眼”,假装没发生,适用于:

  • 死锁概率极低:如个人电脑偶尔死锁,重启即可。
  • 影响极小:如后台进程死锁,不影响用户操作。
  • 典型案例:Windows系统对某些死锁直接忽略,提示用户“程序无响应,是否终止”。

5. 四种策略对比表

策略核心思路类比场景优点缺点
预防破坏死锁条件,从源头杜绝禁止吸烟防止火灾彻底避免死锁可能牺牲资源效率
避免申请时预判是否死锁煤气超标时切断电源灵活,资源利用率高计算复杂,需实时监测
检测+恢复定期检查,发现后处理火灾报警+灭火器灭火应对复杂场景存在延迟,可能损失数据
忽略假装死锁不存在在太阳上不用管火灾简单省力可能导致系统崩溃

以上就是对本次关于操作系统博客内容的总结,后续我们将深入探讨操作系统更多知识。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的操作系统博客专栏
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

http://www.xdnf.cn/news/918505.html

相关文章:

  • 【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具
  • Qt6.8编译MySQL
  • Fullstack 面试复习笔记:HTML / CSS 基础梳理
  • 【物联网-ModBus-ASCII】
  • vue3项目怎么适配不同尺寸的屏幕?
  • 计算机组成与体系结构:补码数制二(Complementary Number Systems)
  • FFmpeg 实现 100 台设备同屏的高效码流压缩
  • Python-进程
  • Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)
  • 柯尼卡美能达Konica Minolta bizhub 205i打印机信息
  • 线程池封装
  • ubuntu 22.04虚拟机配置静态IP
  • springBoot 通过模板导出Excel文档的实现
  • 几种简单的排序算法(C语言)
  • clickhouse 和 influxdb 选型
  • 【Android】浅析View.post()
  • rec_pphgnetv2完整代码学习(二)
  • 机器学习监督学习实战五:六种算法对声呐回波信号进行分类
  • [yolov11改进系列]基于yolov11引入轻量级下采样ContextGuided的python源码+训练源码
  • VBA之Word应用第三章第十节:文档Document对象的方法(三)
  • LeetCode--24.两两交换链表中的结点
  • Android USB 通信开发
  • 数组名作为函数参数详解 —— 指针退化及遍历应用示例
  • Oracle中的异常处理与自定义异常
  • Redis 与 MySQL 数据一致性保障方案
  • Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然
  • chili3d 笔记17 c++ 编译hlr 带隐藏线工程图
  • Jenkins持续集成CI,持续部署CD,Allure报告集成以及发送电子 邮件
  • STM32标准库-输入捕获
  • PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)