进程管理(四):详解死锁

2023-10-30

0 死锁

死锁:当若干个进程竞争系统资源或相互通信而处于永久阻塞状态时,若无外力作用,这些进程都将无法正常向前推进。这些进程中的每一个进程均无限地等待此组进程中的某个其他进程占有的、自己永远无法得到的资源,这种现象即为死锁。

举例:某系统中只有一台打印机和一台输入设备,进程1在占用输入设备,同时提出了对打印机的请求。进程2在占用打印机,同时对输入设备提出请求。这种情况下,进程1、2因相互等待而均无法向前推进,故形成死锁。

一个广为流传的例子:

面试官:解释清楚死锁就发offer!

程序员:发offer就解释清楚死锁!

(面试时慎用......)

1 死锁产生必要条件

互斥条件:进程要求对所访问的资源进行排他性控制,即在一段时间内某种资源仅为一个进程占有。

不剥夺条件:进程所获得的某项资源在使用完成前不能被剥夺,即非抢占式使用资源

请求与保持条件:进程每次申请他所需的一部分资源。在等待新资源分配的同时,进程继续占有已分配的全部资源。该条件已成为部分分配条件

环路等待条件:存在一种进程资源循环等待链,而链中每一个占用的资源被链中的下一个进程所请求

2 处理死锁基本方法

鸵鸟算法:像鸵鸟一样对死锁视而不见

预防死锁:破坏必要条件其中之一,预防死锁的形成

避免死锁:在资源动态分配过程中,用某一种算法防止系统进入不安全状态,从而避免死锁(银行家算法)

检测及解除死锁:通过检测机构及时检测出死锁的发生,然后采取措施解除死锁

2.1 死锁的预防:

        破坏互斥条件:允许多个进程同时访问资源,但是这种方法会受到资源本身固有特性的限制。例如:一台打印机不可能同时为两个进程服务。

        破坏不剥夺条件:对于一个已获得部分资源的进程如果新的资源申请不能得到满足,那么该进程立即释放这些已经获得的资源。这种方法实现复杂,频繁地申请和释放资源会增加系统的开销,降低系统的吞吐量。这种方法通常不会用于剥夺资源后代价较大的场合。

        破坏请求与保持条件:采用静态分配的方法,要求程序在其运行前一次性申请所需要的资源,在他的资源未满足之前不能投入运行,一旦进程投入运行,那这些资源一直归属该进程所有,也不能在提出新的资源请求。这种方法降低了资源利用率,导致系统的资源不能得到充分利用。

        破坏环路等待条件:破坏环路等待可以采用资源有序分配法,将所有的资源都按照一个类型进行编号,每一个进程请求资源时都按照同样的顺序请求资源,同类资源一次性请求完。这种方法限制了新设备的增加,同时不同资源的申请顺序不同,因此会造成资源的浪费,同时按序分配资源也增加了程序编写复杂性。

2.2 死锁避免

        安全状态与不安全状态

        若在某一时刻,系统按照某种顺序序列分配资源满足每个进程的需求,使每个需求都顺利完成,那么当前状态称为安全状态。这种分配序列称为安全序列。反之,若某一时刻系统中无法找到这样的一种安全序列,那么当前状态称为不安全状态

        不安全状态是系统中可能发生死锁的状态而并非系统中已经产生了死锁

        只要系统处于安全状态,便可以避免死锁状态。但若不按照某种安全序列的顺序分配资源,仍可能导致死锁。

例:20个相同的进程并发执行,每个进程需要三个资源r,系统中至少有(    )个r资源才能保障不发生死锁。

答:20 * (3 - 1)  + 1 = 41 个  (假设当前20个进程均分别占用2个r资源,这时若只有40个r资源,那么这20个进程均陷入死锁。若此时有一个剩余的r资源,那么任何一个获得该资源的进程能够执行结束,释放3和空闲r资源供其他进程使用,最终20个进程都可以得到执行)

        银行家算法(Dijkstra):

        假设当前系统中有n个进程,m类资源;定义四种数据结构:

Available:是一个m维数组,Available[i]表示当前系统中空闲的i资源的数量

Max:是一个n * m矩阵,它定义了系统中每一个进程对m类资源的最大需求数。Max[i][j]代表进程i对资源j的最大需求量。

Allocation:是一个n * m矩阵,它定义了系统中每一个进程已经分配的m类资源的个数。Allocation[i][j]代表进程i拥有资源j的个数。

Need:是一个n * m矩阵,定义系统中每个进程还需要的资源个数,这个矩阵随着系统动态推进而改变。

Need[i][j] = Max[i][j] - Allocation[i][j]

银行家算法流程图:

安全检查算法流程图

2.3 死锁检测

        资源分配图:集合P = {P1, P2}; R = {r1, r2}; E = {<P1, r2>, <P2, r1>, <r1, P1>, <r1, P1>, <r1, P2>, <r2, P2>}; 

        代表的状态如下:进程P1已经占用两个r1资源,同时正在申请一个r2资源。

                                     进程P2已经占用一个r1资源和一个r2资源,而且正在申请一个r1资源

        申请边:由进程指向资源

        分配边:由资源指向进程

2.4 死锁解除

        剥夺资源:从其他进程中抢占足够多的资源给死锁进程以解除其死锁状态

        撤销进程:撤销一些进程,直到有足够多的资源可以分配给其他的进程

        进程回退:让一个或多个进程回退到足以回避死锁的地步,进程回退时资源释放资源而不是剥夺

3 死锁与饿死

饥饿:在一个动态系统中,一个优先级较低的进程会随着不断到来的高优先级进程而长期被阻塞的状态称为饥饿

饿死:当饥饿到一定程度,该进程所执行的任务即使被执行也不再具有实际意义的时候,称为该进程被饿死

活锁:在忙时等待条件下发生的饥饿称为活锁

死锁:在不受外力的情况下,当前陷入自锁的程序无法正常运行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程管理(四):详解死锁 的相关文章

随机推荐

  • 三维视觉--基于Kinect2.0深度相机的点云获取方案实现(C++版)

    上一篇中使用的点云获取设备是Intel Realsense d455相机 这两天接触的相机不少 也发现很多点云检测和分割的论文中使用的都是Kinect相机 今天就再分享一篇使用Kinect2 0获取点云并使用C 实现 首先还是相机SDK的下
  • PADS Logic VX2.7 原理图库绘制

    首先打开PADS Logic VX2 7 1 点击文件 点击库 2 新建库 3 存放放在你想存放的文件夹中 文件命名尽量英文数字 其实中文也没事我试过 哈哈哈 后缀pt9 然后点击保存 4 点击管理库列表 先点击刚刚创建的库 点击上 移动到
  • 面向对象和面向过程:两种程序设计思想的基础介绍和对比

    一 面向过程程序设计 面向过程 程序 算法 数据结构 面向过程的核心理念是 步骤分解 即把需要解决的问题分成一个个步骤 并用不同函数来实现它们 设计思维 自顶向下 逐步求精 按照逻辑顺序从上到下完成整个过程的编写 让我们用一个简单的数学问题
  • 3DMAX中的7个基本建模小窍门

    3DMAX中的7个基本建模小窍门 在这里 我们分享一些基本的3dmax建模技巧 希望能帮助您作为3D艺术家的成长和发展 虽然这篇文章是从3ds Max的角度进行阐述的 但这里提到的所有内容对于任何其他建模应用程序都同样有效 例如Maya C
  • 软件测试52讲-笔记(持续更新中...)

    软件测试52讲 01 你真的懂测试吗 从 用户登录 测试谈起 02 如何设计一个 好的 测试用例 03 什么是单元测试 如何做好单元测试 04 为什么要做自动化测试 什么样的项目适合做自动化测试 05 你知道软件开发各阶段都有哪些自动化测试
  • Linux上安装Matlab2020a

    目录 一 下载 Crack 和 ISO 镜像文件 二 安装MATLAB 1 挂载镜像并开始运行 install 文件 2 选择 使用Key安装 3 取消挂载 三 激活MATLAB 四 创建快捷启动方式 一 下载 Crack 和 ISO 镜像
  • 硬件系统工程师宝典(34)-----FLASH电路如何设计?

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们了解了存储器可分为RAM和ROM 根据不同特性也可以逐级细分 并且简单介绍了EEPROM 今天我们讲一讲FLASH有哪几种 NOR FLASH
  • elementui table组建高度动画

    el table transform all 0 3s height 0 Vue component el table extends Element Table created this KaTeX parse error Expecte
  • The PLY Polygon File Format

    The PLY Polygon File Format Author Greg Turk Introduction This document presents the PLY polygon file format a format fo
  • 格密码学习笔记(一):格的定义、基本区域和行列式

    文章目录 格的基本定义 格的基本区域 格的行列式 致谢 格的基本定义 定义1 给定 n n n维实数空间 R n mathbb R n
  • Stm32F103&Rt_Thread系列开发——03 日志管理

    Stm32F103 Rt Thread系列开发 03 日志管理 一 前言 本系列教程教大家如何从0开始 在Stm32F1系列芯片上使用Rt Thread实时操作系统进行程序开发 本教程选择的开发板为 正点原子Mini STM32F103RC
  • S7-200SMART案例分析——步进顺控以及替代方案

    这一篇文章我们以一个非常简单的小例子来说明步进顺控的用法 以及优缺点 我们会使用三种方式来写这个小例子 思路都是一步一步执行程序 但是代码完全不一样 例子为顺序点亮三盏灯并且全部点亮后再依次熄灭 间隔时间我们假定1秒 然后循环往复 第一种方
  • 因果关系分析方法

    因果关系推断 可以说是数据分析领域最难的问题之一 争吵很多年也没有定论 经常同学们被问到 到底这个问题的原因是什么 都会觉得分析起来很挠头 今天我们系统讲解下 1 常见方法1 拆解法 最常见的用来求因果关系的方法 是拆解法 把一个结果指标
  • 华为oj 字串的连接最长路径查找

    这道题应该是初级中最难的了吧 这道题整体思路应该是 把每个字符串看成一个节点 这样我们要求的就是在一个有向图中两点形成的最长路径 对于这种类型的题目 可以考虑采用佛洛依德算法 因为它是查找有向图所有两点之间的路径长度 这样很容易就会找到最长
  • 创建并搭建uView框架

    1 先创建一个项目 2 在项目的内部终端输入命令安装 安装 npm install uview ui 3 如果安装成功文件下面会出现node modules目录 3 引入uView主JS库 main js import uView from
  • 如何根据波特率计算设备每秒传输多少字符

    前言 1 微机原理要进行期末考试了 要准备 预习 了 今天看到关于波特率和字符传输的知识 感觉这个在实际项目中可能会使用到 2 因为之前我在学习韦东山老师的课程的时候 他通过波特率计算出了字符传输速度 然后迅速定位到了问题 所以我就将这个知
  • day08 字符串

    LeetCode 344 翻转字符串 注 此处是 left lt right 因为当left 和 right处于同一位置时 无需进行原地翻转 package algor trainingcamp author lizhe version 1
  • SEAndroid学习

    概要 SEAndroid 基于SELinux实现 SELinux 的目标就是实现对Linux 系统上的操作做精细化安全管理 为了达到精细化安全管理无非就限制一些主体访问对某些资源执行某些操作 在SEAndroid里面主体一般是进程 客体一般
  • Flutter 之 Stepper

    Flutter 之 Stepper Stepper 组件在移动端应用中经常被使用 它可以让用户通过一系列步骤来完成一个复杂的操作 Flutter 中的 Stepper 组件提供了一个简单的方式来实现这个功能 如何使用 Stepper 组件
  • 进程管理(四):详解死锁

    0 死锁 死锁 当若干个进程竞争系统资源或相互通信而处于永久阻塞状态时 若无外力作用 这些进程都将无法正常向前推进 这些进程中的每一个进程均无限地等待此组进程中的某个其他进程占有的 自己永远无法得到的资源 这种现象即为死锁 举例 某系统中只