Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机系统漫游
  • 进程与线程:操作系统的核心调度单元
  • 12.内存管理-操作系统的资源分配大师
  • 16.内存管理-操作系统的资源分配艺术
  • 内存管理-操作系统的核心资源分配
  • 内存管理-操作系统的核心资源分配器
  • 内存管理-操作系统的核心资源分配机制
  • 内存管理:操作系统的核心资源调度
  • 内存管理:操作系统的资源分配大师
  • 内存管理 - 操作系统的资源分配核心
  • 内存管理:操作系统的资源分配艺术
  • 文件系统与I/O管理-操作系统的数据持久化桥梁
  • 设备管理-操作系统的硬件交互之门
  • 进程间通信-操作系统的对话桥梁
  • 操作系统安全与保护-数字世界的守护者
  • 调度算法-操作系统的指挥棒
  • 死锁-操作系统的资源竞争困境
    • 前言
    • 死锁的四个必要条件
      • 1. 互斥条件
      • 2. 占有并等待条件
      • 3. 不可剥夺条件
      • 4. 循环等待条件
    • 死锁的预防策略
      • 1. 破坏互斥条件
      • 2. 破坏占有并等待条件
      • 3. 破坏不可剥夺条件
      • 4. 破坏循环等待条件
    • 死锁的避免算法
      • 1. 安全状态与不安全状态
      • 2. 银行家算法
      • 3. 资源排序算法
    • 死锁的检测与恢复
      • 1. 死锁检测算法
      • 资源分配图算法
      • 死锁检测矩阵算法
      • 2. 死锁恢复策略
      • 1. 进程终止
      • 2. 资源抢占
    • 结语
  • 系统调用-应用程序与操作系统的对话桥梁
  • 虚拟化技术-操作系统的资源抽象魔法
  • 实时操作系统-时间的守护者
  • 并发控制-操作系统的协同艺术
  • 中断处理-操作系统的生命线
  • 分布式操作系统-跨越多机的资源协调大师
  • 操作系统启动过程-从按下电源键到可用的奇妙旅程
  • 页面置换算法-操作系统的内存魔术师
  • operating_system
Jorgen
2026-01-28
目录

死锁-操作系统的资源竞争困境

# 前言

在操作系统的世界里,资源是有限的,而进程对资源的需求却是无限的。当多个进程因争夺系统资源而造成一种互相等待的僵局,导致所有相关进程都无法继续执行时,我们就遇到了操作系统中最令人头疼的问题之一——死锁。

想象一下这样的场景:两个人在狭窄的走廊相遇,互相礼让对方先过,结果谁也过不去。这就是生活中的"死锁"现象。在计算机系统中,死锁可能导致系统性能下降甚至完全瘫痪,因此理解死锁的原理、预防策略和解决方法对操作系统设计者和开发者至关重要。

本文将深入探讨死锁的四个必要条件、预防策略、避免算法以及检测与恢复方法,帮助读者全面理解这一操作系统经典问题。

# 死锁的四个必要条件

根据Coffman等人于1971年提出的理论,死锁的发生必须同时满足以下四个条件:

# 1. 互斥条件

一个资源在任意时刻只能被一个进程使用。如果另一个进程请求该资源,请求者必须等待,直到资源被释放。例如,打印机一次只能被一个进程使用。

# 2. 占有并等待条件

一个进程因请求资源而阻塞时,对已获得的资源保持不放。例如,一个进程已经获得了打印机资源,同时又在等待扫描仪资源,即使扫描仪可能被其他进程使用。

# 3. 不可剥夺条件

进程已获得的资源,在使用完之前不能被剥夺,只能在使用完时由自己释放。例如,进程正在使用打印机,系统不能强制收回打印机给其他进程使用。

# 4. 循环等待条件

存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被下一个进程所请求。例如,进程P1等待进程P2的资源,进程P2等待进程P3的资源,而进程P3又等待进程P1的资源。

THEOREM

只有当以上四个条件同时满足时,才会发生死锁。因此,预防死锁的关键在于破坏这四个条件中的一个或多个。

# 死锁的预防策略

预防死锁是通过破坏死锁的四个必要条件来实现的,主要有以下几种策略:

# 1. 破坏互斥条件

思路:允许资源同时被多个进程访问,即采用资源共享的方式。

实现方式:

  • 将某些资源改为可共享资源,如只读文件
  • 使用"假脱机"技术,如假脱机打印,允许多个进程同时使用打印机

缺点:

  • 并非所有资源都可以共享,如打印机、写文件等
  • 可能导致系统性能下降和资源浪费

# 2. 破坏占有并等待条件

思路:进程在请求资源前必须一次性申请所有需要的资源。

实现方式:

  • 资源一次性分配:进程运行前,一次性申请所有需要的资源
  • 资源预分配:进程开始运行前,系统为其分配所需全部资源

缺点:

  • 资源利用率低,许多资源可能长时间闲置
  • 可能导致进程饥饿,某些进程因无法获得全部资源而永远无法运行

# 3. 破坏不可剥夺条件

思路:当进程因请求资源而阻塞时,必须释放已获得的资源。

实现方式:

  • 如果进程请求的资源不能立即分配,则释放所有已获得的资源
  • 当进程再次运行时,重新申请所有资源

缺点:

  • 实现复杂,需要回滚进程状态
  • 可能导致进程前功尽弃,增加系统开销

# 4. 破坏循环等待条件

思路:对所有资源进行编号,进程必须按编号顺序请求资源。

实现方式:

  • 为每种资源类型赋予一个唯一编号
  • 规定进程必须按编号递增的顺序请求资源

缺点:

  • 限制了资源的灵活使用
  • 可能导致某些进程无法获得资源,即使资源处于空闲状态

提示

在实际系统中,通常采用破坏循环等待条件的方法预防死锁,因为它对系统性能影响较小且实现相对简单。

# 死锁的避免算法

死锁预防策略可能会限制系统的并发性和资源利用率,而死锁避免则是在资源分配过程中进行判断,确保系统不会进入不安全状态。

# 1. 安全状态与不安全状态

安全状态:如果系统能够按某种顺序为每个进程分配其所需资源,直至满足最大需求,则称系统处于安全状态。

不安全状态:如果不存在这样的分配顺序,则系统处于不安全状态。不安全状态不一定会导致死锁,但如果进程继续申请资源,则可能进入死锁。

# 2. 银行家算法

银行家算法是最著名的死锁避免算法,由Dijkstra于1965年提出。该算法模拟银行家如何安全地分配资金给客户。

算法核心:

  1. 当进程请求资源时,系统先假定分配该资源
  2. 然后检查系统是否仍处于安全状态
  3. 如果安全,则分配资源;否则,拒绝请求

数据结构:

  • Available:可用资源向量
  • Max:最大需求矩阵
  • Allocation:已分配矩阵
  • Need:需求矩阵(Need = Max - Allocation)

算法步骤:

  1. 初始化:检查进程请求是否小于其需求
  2. 假定分配:更新Available和Allocation
  3. 安全性检查:
    • 初始化Work = Available,Finish = [false, false, ..., false]
    • 寻找满足Need[i] ≤ Work的进程i
    • 如果找到,设置Work = Work + Allocation[i],Finish[i] = true,重复步骤
    • 如果所有进程Finish[i] = true,系统安全;否则不安全

优缺点:

  • 优点:允许进程动态申请资源,提高了资源利用率
  • 缺点:需要提前知道进程的最大资源需求,实现复杂,系统开销大

# 3. 资源排序算法

另一种死锁避免方法是资源排序算法,通过为资源类型赋予唯一优先级,并规定进程必须按优先级顺序请求资源。

算法特点:

  • 每种资源类型有一个唯一优先级
  • 进程必须按优先级递增的顺序请求资源
  • 可以避免循环等待条件

适用场景:

  • 适用于资源类型较少且优先级明确的系统
  • 实现简单,但灵活性较差

# 死锁的检测与恢复

在某些系统中,死锁预防或避免的成本过高,此时可以采用死锁检测与恢复策略。

# 1. 死锁检测算法

死锁检测算法定期检查系统是否处于死锁状态。常用的算法包括:

# 资源分配图算法

基本概念:

  • 资源分配图是一个有向图,包括进程节点和资源节点
  • 从进程指向资源的边表示请求边
  • 从资源指向进程的边表示分配边

检测步骤:

  1. 构建资源分配图
  2. 寻找环路:
    • 移除所有分配边
    • 如果存在进程节点没有入边,则移除该节点及其所有出边
    • 重复上述过程,直到无法移除节点
  3. 如果图中仍有节点,则存在死锁

# 死锁检测矩阵算法

该算法使用矩阵运算来检测死锁,类似于银行家算法的安全性检查。

# 2. 死锁恢复策略

当检测到系统处于死锁状态时,可以采用以下恢复策略:

# 1. 进程终止

选择终止进程的策略:

  • 终止所有死锁进程:简单粗暴但可能导致大量工作丢失
  • 逐个终止进程:每次终止一个死锁进程,直到死锁解除
  • 基于优先级终止:优先终止低优先级或代价小的进程

考虑因素:

  • 进程的运行时间和已用CPU时间
  • 进程完成所需的时间
  • 进程已使用的资源数量
  • 进程的类型(交互式或批处理)

# 2. 资源抢占

思路:从一个或多个进程中抢占资源,分配给死锁进程。

实现方式:

  • 回滚:将被抢占进程的状态回滚到某个安全状态
  • 事务:使用事务来确保资源抢占可以原子性地执行

挑战:

  • 可能导致大量计算工作丢失
  • 实现复杂,需要保存和恢复进程状态

"预防胜于治疗"——这句话同样适用于操作系统中的死锁问题。

# 结语

死锁是操作系统设计中不可避免的问题,理解死锁的原理和解决方案对构建健壮的系统至关重要。本文详细探讨了死锁的四个必要条件、预防策略、避免算法以及检测与恢复方法。

在实际系统中,选择哪种死锁处理策略取决于具体的应用场景和系统需求。对于关键系统,如银行交易系统,通常采用保守的死锁预防策略;而对于一般用途的操作系统,则可能采用死锁检测与恢复策略,以平衡系统性能和可靠性。

随着云计算和分布式系统的发展,死锁问题也呈现出新的挑战和解决方案。未来的操作系统设计需要更加智能和自适应的 deadlock 处理机制,以应对日益复杂的系统环境和资源竞争。

作为开发者,我们应该深入理解死锁的本质,在系统设计和编码实践中避免死锁的发生,构建更加稳定可靠的软件系统。

"在计算机科学中,我们解决了所有问题,只是通过创造新问题的方式。" —— 操作系统设计中的死锁问题正是这句话的生动体现。

#操作系统#死锁#资源管理
上次更新: 2026/01/28, 10:49:48
调度算法-操作系统的指挥棒
系统调用-应用程序与操作系统的对话桥梁

← 调度算法-操作系统的指挥棒 系统调用-应用程序与操作系统的对话桥梁→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式