计算机操作系统(十五)死锁的概念与死锁的处理方法
计算机操作系统(十五)互斥锁,信号量机制与整型信号量
- 前言
- 一、死锁定义
- 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的操作顺序:
- 先拿走打印机A;
- 再想拿打印机B;
- 用完后先还B,再还A。
-
进程P2的操作顺序:
- 先拿走打印机B;
- 再想拿打印机A;
- 用完后先还A,再还B。
死锁怎么发生的?
- P1拿走了A,同时 P2拿走了B;
- P1现在需要B,但B在P2手里;
- P2现在需要A,但A在P1手里;
- 双方都在等对方释放资源,谁也动不了——这就是死锁!
- 两个进程各自占着对方需要的资源,形成“循环等待”(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. 为什么说死锁这四个条件缺一就不会发生死锁
- 互斥条件不成立
若资源可被多个进程同时共享(如内存中的可重入代码),则不存在进程间对资源的独占需求。
- 此时,进程无需竞争资源,自然不会因资源争夺陷入死锁。
- 请求与保持条件不成立
若进程必须一次性申请所有所需资源(或在请求新资源时释放已持有资源),则不会出现“持有部分资源并等待其他资源”的状态。
- 例如,进程启动前预分配所有资源,避免中间状态的资源持有与等待,破坏死锁的积累条件。
- 不可剥夺条件不成立
若系统允许强制抢占资源(如优先级高的进程可抢占低优先级进程的资源),则当进程等待资源时,系统可从其他进程处夺回资源并分配给等待进程。
- 这会打破“资源一旦分配就不可强制收回”的僵局,阻止死锁的形成。
- 循环等待条件不成立
若系统采用资源有序分配策略(如为资源编号,进程只能按升序请求),则进程间无法形成资源请求的循环链。
- 例如,进程A持有资源1并请求资源2,进程B持有资源2并请求资源1的环将被杜绝,直接消除死锁的结构基础。
三、处理死锁的方法
1. 死锁预防
类比:在加油站贴“禁止吸烟”,直接消除火灾隐患。
核心思想:破坏死锁的四个必要条件,让死锁根本无法发生。
下面我们逐个讲解死锁预防四个条件的难易程度
1.1 破坏互斥条件(难)
- 含义:让资源能共享使用,不独占。
- 例子:打印机本是独占资源,但可以用“虚拟打印机”技术(如文件打印)让多个进程“共享”。
- 局限:多数资源天生只能独占(如摄像头、扫描仪),无法破坏。
1.2 破坏不可剥夺条件(部分可行)
- 含义:允许强制回收资源(类似老师强行没收文具)。
- 例子:
- 进程占用的内存可以被系统强制释放(如进程崩溃时)。
- 但打印机不行:打印到一半强制中断会导致纸张损坏。
- 适用场景:仅适用于可“保存和恢复状态”的资源(如内存、CPU)。
- 例子:
1.3 破坏请求与保持条件(常用但有缺点)
- 含义:进程必须一次性申请所有需要的资源,要么全拿到,要么全不拿(类似“一次借完所有文具”)。
- 例子:
- 你想借铅笔和橡皮,必须同时申请这两样:
- 如果有铅笔和橡皮,一起拿走;
- 如果缺一样,就不拿任何东西,等下次再试。
- 你想借铅笔和橡皮,必须同时申请这两样:
- 缺点:
- 预知未来难:进程可能不知道自己未来需要什么资源(比如游戏程序无法提前知道要加载多少地图资源)。
- 资源浪费:借了铅笔后可能很久才用橡皮,铅笔闲置浪费。
- 进程卡住:很多进程因等全资源而无法启动,效率低。
- 例子:
2. 死锁避免
类比:煤气灶检测到煤气超标时,自动切断电源(预判风险,提前阻止)。
核心思想:在进程申请资源时,先预判是否会导致死锁,若会则拒绝请求。
2.1 安全状态与安全序列
- 安全状态:系统能按某种顺序(安全序列)让所有进程都完成,不会死锁。
- 类比:教室里有3支笔,2个同学A和B:
- A需要2支笔,B需要1支笔;
- 先给B分配1支(B用完归还),再给A分配2支——这是安全状态。
- 类比:教室里有3支笔,2个同学A和B:
- 不安全状态:无法找到安全序列,可能死锁。
- 类比:A和B各需2支笔,总共有3支笔:
- 若先给A 1支,B 1支,剩下1支,两人都在等对方的笔——不安全状态,可能死锁。
- 类比:A和B各需2支笔,总共有3支笔:
3. 死锁检测与死锁恢复
类比:房间装烟雾报警器,发现火灾时用灭火器灭火(先检测,再处理)。
核心思想:
- 定期检测:隔一段时间检查系统是否出现死锁(如资源利用率突然变低时)。
- 恢复措施:发现死锁后,通过“终止进程”或“剥夺资源”打破僵局。
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
非常感谢您的阅读,喜欢的话记得三连哦 |