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

【系统架构设计师】操作系统 - 进程管理 ⑤ ( 进程死锁 | 死锁 四大条件 | 死锁资源数计算 )

文章目录

  • 一、进程 死锁
    • 1、死锁 概念
    • 2、死锁 案例 ( 重点 )
    • 3、死锁 四大条件
    • 4、解除死锁 - 破坏 死锁 四大条件
    • 5、解除死锁 - 有序分配
    • 6、解除死锁 - 银行家算法
  • 二、软考考点
    • 1、死锁资源数计算 案例
    • 2、死锁资源数计算公式 1
    • 3、死锁资源数计算公式 2
    • 4、鸽巢原理





一、进程 死锁




1、死锁 概念


死锁 概念 : 两个或两个以上的进程 , 在执行过程中 , 因 争夺资源 而造成的一种 互相等待的现象 , 如果没有外力作用 , 所有进程都无法继续执行 , 进程 等待 不可能发生的条件 , 就会产生 " 死锁 " ;

死锁 进程 : 多个进程产生 " 死锁 " , 就会造成 " 系统死锁 " , 这些 永远在互相等待的进程称为 " 死锁进程 " ;


2、死锁 案例 ( 重点 )


进程死锁 案例 : 进程 1 和 进程 2 都在运行 ;

  • 进程 1 需要 资源 A 和 资源 B , 已经持有 资源 A , 等待 资源 B ;
  • 进程 2 需要 资源 B 和 资源 A , 已经持有 资源 B , 等待 资源 A ;
  • 两个进程 都不释放 已有资源 ;
  • 系统 不剥夺 每个进程的 已有资源 ;
  • 这里 产生了 环路等待 ;

这样就产生了死锁 , 如下图所示 :

在这里插入图片描述


3、死锁 四大条件


" 死锁 " 形成 需要满足以下 四大条件 :

  • 互斥条件 ( Mutual Exclusion ) : 资源具有排他性 , 即 一个资源每次只能被一个进程独占使用 , 造成 死锁 的资源 是 " 互斥 " 的 , 同一时间只能有一个进程访问该资源 ;
  • 占有且等待 ( Hold and Wait ) : 进程 已持有至少一个资源 , 同时又在 请求其他资源 , 且请求的资源被其他进程占有 , 进程 会 " 保持 " 当前 已经拥有的资源 , 并且保持等待状态 ;
  • 不可剥夺 ( No Preemption ) : 进程 已获得的资源在未使用完毕前 , 不能被强制剥夺 , 只能由进程主动释放 , 进程 " 不剥夺 " 其它进程 占有的 本应用急需的 资源 ;
  • 循环等待 ( Circular Wait ) : 存在一个 进程等待链 , 每个进程都在等待 下一个进程 持有的资源 , 形成环路 , 多个进程 等待的 资源 形成环路 ;

在这里插入图片描述


4、解除死锁 - 破坏 死锁 四大条件


上述 四大条件 只要打破任意一个 , 就可以解除 " 死锁 " 状态 , 破坏死锁条件的方式 :

  • 互斥条件 ( Mutual Exclusion ) : 允许资源共享 , 多个进程可共享同一资源 ;
  • 占有且等待 ( Hold and Wait ) : 进程执行前需要 一次性申请所有资源 , 避免进程 占有资源却不执行 和 无限期等待申请不到的资源 ;
    • 银行家算法 就是 破坏该条件 的解决方案 ;
  • 不可剥夺 ( No Preemption ) : 允许强制回收资源 , 该操作可能导致进程执行失败 ;
  • 循环等待 ( Circular Wait ) : 有序分配算法 就是 破坏该条件 的解决方案 ;

5、解除死锁 - 有序分配


有序分配法是一种通过破坏 " 循环等待 ( Circular Wait ) " 条件来避免死锁的方法 , 该算法的核心思想是要求 所有进程必须按照 相同的顺序 申请资源 ;

  • 资源排序 : 对所有可申请的 资源 进行排序 , 每个进程在申请资源时必须严格按照这个顺序进行 ;
  • 进程申请 : 当进程需要申请多个资源时 , 它必须 首先申请 序号最小的资源 , 然后申请 序号更大的资源 ;
  • 避免环路 : 由于所有进程都按照相同的顺序申请资源 , 因此不会出现一个进程持有另一个进程所需的资源 , 同时又在等待第三个进程释放它所持有的资源的情况 , 从而避免了环路等待条件 ;

有序分配法通过 循环等待 ( Circular Wait ) 条件来避免死锁 , 实现简单但 资源利用率低、灵活性差 ;


6、解除死锁 - 银行家算法


银行家算法 是一种更为复杂但更为有效的避免死锁的方法 , 它以银行借贷系统的 分配策略 为基础 , 通过模拟资源分配的情况来确保系统始终处于安全状态 ;

系统模拟资源分配过程 , 试图找到一个安全进程序列 , 按照这个序列分配资源后 , 每个进程都能顺利完成 ;

如果能找到这样的安全序列 , 则系统处于安全状态 ; 否则 , 系统处于不安全状态 ;


银行家算法 虽然实现复杂 , 但能够 动态地分配资源 , 并提高资源的利用率 ;





二、软考考点




1、死锁资源数计算 案例


操作系统 中 有 3 个进程 , 每个进程都需要 5 个系统资源 , 系统资源数为 n , 分析系统中资源数量 与 死锁 的关联 ;

  • n < 5 的情况 : 系统肯定死锁 ; 假如 系统只有 4 个资源 , 则任何一个进程无都法执行 , 整个系统死锁 ;
  • n = 5 的情况 : 大概率造成死锁 ;
    • 最好情况 : 每次将所有资源分配给一个进程 , 3 个进程是有可能执行完毕的 ;
    • 最坏情况 : 假如 三个进程 分别持有若干资源不释放 , 则有可能造成死锁 ;
  • 5 < n <= 12 的情况 : 可能死锁 ;
    • n = 12 的最坏情况 : 三个进程平均分配资源 , 每个进程分配到 4 个资源 , 也会造成死锁 ;
  • n >= 13 的情况 : 不可能死锁 ;
    • 只要在 n = 12 的情况下 , 再多增加一个资源 , 就会有一个进程可以执行完毕 , 释放出全部资源 , 死锁解除 ;

2、死锁资源数计算公式 1


进程个数 m 个 , 每个进程需要资源数 w 个资源 , 则资源数 n >= m (w - 1) + 1 可以保证系统无法死锁 ;


3、死锁资源数计算公式 2


进程个数 m 个 , 每个进程需要资源数 wi 个资源 ( i = 1, 2, … , m ) ,

  • 第 1 个进程需要 w1 个资源 ;

  • 第 2 个进程需要 w2 个资源 ;

  • 第 m 个进程需要 wm 个资源 ;

则资源数 n ≥ ∑ i = 1 m ( w i − 1 ) + 1 n \geq \sum_{i = 1}^{m}(w_i - 1) + 1 ni=1m(wi1)+1 可以保证系统无法死锁 ;

在这里插入图片描述


4、鸽巢原理


死锁资源数计算 的 底层原理 是 鸽巢原理 ;


鸽巢原理 :

将 n + 1 个物体 放到 n 个盒子 中 , 则

一定存在一个盒子 中 至少 含有 2 个 或 2 个以上的物体 ;

这个存在的一个盒子 就是 为 " 进程 " 分配了 满足执行的所有资源 ;


鸽巢原理 实际上是 多对少 的配置 , 至少存在一个多对一的情况 ;


参考 :

  • 【组合数学】鸽巢原理 ( 鸽巢原理简单形式 | 鸽巢原理简单形式示例 1、2、3 )
  • 【组合数学】鸽巢原理 ( 鸽巢原理简单形式示例 4、5 )

博客 ;


http://www.kler.cn/a/581916.html

相关文章:

  • facebook游戏投广:提高广告关键数据的方法
  • Java实用注解篇:@Transactional 事务失效的场景深度解析
  • BambuStudio学习笔记:MultiMaterialSegmentation
  • 在Spring Boot项目中如何实现获取FTP远端目录结构
  • 架构师之路——设计模式篇(总览)
  • 【鸿蒙开发】Hi3861学习笔记- GPIO之LED
  • 数据安全之策:备份文件的重要性与自动化实践
  • C#与Python的差别
  • 如何在Spring Boot中校验用户上传的图片文件的两种方法
  • C语言(23)
  • 系统架构设计师-第5章 计算机网络
  • nextjs15简要介绍以及配置eslint和prettier
  • 【MySQL是怎么运行的】0、名词解释
  • 分布式 ID 设计方案
  • Rust 之一 基本环境搭建、各组件工具的文档、源码、配置
  • 【每日八股】Redis篇(四):持久化(下)
  • 机器学习中的梯度下降是什么意思?
  • 图像识别技术与应用课后总结(16)
  • Spring MVC 详细分层和微服务
  • Redis线上问题排查指南:常见错误与解决思路