进程死锁的处理策略之预防死锁,避免死锁以及死锁的检测和解除

news2025/1/14 1:08:29

1.不允许死锁发生

1.静态策略:预防死锁

知识回顾:死锁的产生必须满足四个必要条件,只要其中一个或者几个条件不满足,死锁就不会发生。

1.破环互斥条件

互斥条件:
只有对必须互斥使用的资源的争抢才会导致死锁。

如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。
比如: SPOOLing技术。操作系统可以采用SPOOLing 技术把独占设备在逻辑上改造成共享设备。
比如,用SPOOLing技术将打印机改造为共享设备…

在这里插入图片描述
该策略的缺点:
并不是所有的资源都可以改造成可共享使用的资源。
并且为了系统安全,很多地方还必须保护这种互斥性。
因此,很多时候都无法破坏互斥条件

2.破环不可剥夺条件

不剥夺条件:
进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

  1. 方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。
  2. 方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)

该策略的缺点:

  • 实现起来比较复杂。
  • 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
  • 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
  • 若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重新申请。如果一直发生这样的情况,就会导致进程饥饿。
3.破环请求和保持条件

1.请求和保持条件:
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,
此时请求进程被阻塞,但又对自己已有的资源保持不放。

2.可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,
在它的资源未满足前,不让它投入运行。
一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

3.该策略实现起来简单,但也有明显的缺点:
有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,
就会造成严重的资源浪费,资源利用率极低
另外,该策略也有可能导致某些进程饥饿

4.破环循环和等待条件

1.循环等待条件:
存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

2.可采用顺序资源分配法
首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源
同类资源(即编号相同的资源)一次申请完。

3.原理分析:
一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。
按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,
从而就不会产生循环等待的现象。

假设系统中共有10个资源,编号为1,2,…10
在这里插入图片描述
该策略的缺点:
1.不方便增加新的设备,因为可能需要重新分配所有的编号;
2.进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;
3.必须按规定次序申请资源,用户编程麻烦。

2.动态策略:避免死锁

1.安全序列

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。
只要能找出一个安全序列,系统就是安全状态
当然,安全序列可能有多个。

如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。
这就意味着之后可能所有进程都无法顺利的执行下去。
当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,
不过我们在分配资源之前总是要考虑到最坏的情况。

2.系统的不安全状态与死锁的联系

如果系统处于安全状态,就一定不会发生死锁。
如果系统进入不安全状态,就可能发生死锁
处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)

因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。
这也是“银行家算法”的核心思想。

3.避免系统进入不安全状态:银行家算法

银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,
不会发生不能满足所有客户需要的情况。
后来该算法被用在操作系统中,用于避免死锁

1.核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。
如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

2.例题:
可以把单维的数字拓展为多维的向量。
比如:系统中有5个进程P0-P4,3种资源R0~R2,初始数量为(10,5,7),则某一时刻的情况可表示如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.代码实现
假设系统中有n个进程,m种资源。
每个进程在运行前先声明对各种资源的最大需求数,
则可用一个nm的矩阵(可用二维数组实现)表示所有进程对各种资源的最大需求数。
不妨称为最大需求矩阵Max,Max[i, j]=K表示进程Pi最多需要K个资源Rj。
同理,系统可以用一个n
m的分配矩阵Allocation表示对所有进程的资源分配情况。
Max 一 Allocation =Need矩阵,表示各进程最多还需要多少各类资源。
另外,还要用一个长度为m的一维数组Available表示当前系统中还有多少可用资源。

某进程Pi向系统申请资源,可用一个长度为m的一维数组Request表示本次申请的各种资源量。

可用银行家算法预判本次分配是否会导致系统进入不安全状态:
①如果 R e q u e s t [ i ] ≤ N e e d [ i , j ] ( 0 ≤ j ≤ m ) Request[i]≤Need[i, j](0≤j≤m) Request[i]Need[i,j](0jm)便转向②;否则认为出错。
②如果 R e q u e s t [ i ] ≤ A v a i l a b l e [ i ] ( 0 ≤ j ≤ m ) Request[i]≤Available[i] (0≤j≤m) Request[i]Available[i](0jm),便转向③;否则表示尚无足够资源,Pi必须等待。
③系统试探着把资源分配给进程Pi,并修改相应的数据(并非真的分配,修改数值只是为了做预判):
在这里插入图片描述

④操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式分配;否则,恢复相应数据,让进程阻塞等待。

安全性算法步骤:

  1. 检查当前的剩余可用资源是否能满足某个进程的最大需求,
  2. 如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
  3. 不断重复上述过程,看最终是否能让所有进程都加入安全序列。

2.允许死锁的发生

1.资源分配图

在这里插入图片描述

1.两种结点
  • 进程结点:对应一个进程。
  • 资源结点:对应一类资源,一类资源可能有多个。
2.两种边
  • 进程结点 ⟶ \longrightarrow 资源结点:表示进程想申请几个资源(每条边代表一个)
  • 资源节点 ⟶ \longrightarrow 进程结点:表示已经为进程分配了几个资源(每条边代表一个)

2.死锁的检测

为了能对系统是否已发生了死锁进行检测,必须:
①用某种数据结构(资源分配图)来保存资源的请求和分配信息;
②提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

  1. 在资源分配图中,找出既不阻塞又不是孤点的进程Pi(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。
  2. 如下图中,R1没有空闲资源,R2有一个空闲资源。
  3. 若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源)。
  4. 消去它所有的请求边和分配边,使之称为孤立的结点。
  5. 在下图中,P1是满足这一条件的进程结点,于是将P1的所有边消去。
  6. 进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。
  7. 在下图中,P2就满足这样的条件。根据1中的方法进行一系列简化后,若能消去途中所有的边,则称该图是可完全简化的。

在这里插入图片描述
依次消除与不阻塞进程相连的边,直到无边可消。
注:所谓不阻塞进程是指其申请的资源数还足够的进程。

死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁。

3.死锁的解除

一旦检测出死锁的发生,就应该立即解除死锁。
补充:并不是系统中所有的进程都是死锁状态,
用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程。

1.解除死锁的主要方法有:
  1. 资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
  2. 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
  3. 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
2.解决死锁的优先级:
  1. 进程优先级
  2. 已执行多长时间
  3. 还要多久能完成
  4. 进程已经使用了多少资源
  5. 进程是交互式的还是批处理式的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1081728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构和算法(12):词典

词典 逻辑上的词典,是由一组数据构成的集合,其中各元素都是由关键码和数据项合成的词条(entry)。 映射(map)结构与词典结构一样,也是词条的集合。 二者的差别仅仅在于,映射要求不同…

cpp文件操作

文件操作 数据流 在cpp中,流(stream)是一个抽象概念,用于描述如何从一个位置到又一个位置传输数据。流主要用于I/O操作。 数据流包括两大类:1. 输入流(istream):数据从某个源流入程序, 2. 输出流(ostrea…

CCF CSP认证历年题目自练Day28

题目一 试题编号: 202109-1 试题名称: 数组推导 时间限制: 1.0s 内存限制: 512.0MB 样例1输入 6 0 0 5 5 10 10 样例1输出 30 15 样例2输入 7 10 20 30 40 50 60 75 样例2输出 285 285 题目分析(个人理解&#…

yml显示不了小树叶图标解决办法

问题描述 在项目中,idea新建yml文件不显示小绿叶图标 1、解决办法一 找到下图设置:file -> settings -> Plugins 查看spring boot插件是非已安装(按照下图步骤查看) 2、解决办法二 ctrlalts,去File Types查…

记一次使用vue-markdown在vue中解析markdown格式文件,并自动生成目录大纲

先上效果图 如图所示,在网页中,能直接解析markdown文档,并且生成目录大纲,也支持点击目录标题跳转到对应栏目中,下面就来讲讲是如何实现此功能的。 1、下载vue-markdown yarn add vue-markdown 2、在页面中渲染markdo…

MySQL数据生成工具mysql_random_data_load

在看MySQL文章的时候偶然发现生成数据的工具,此处直接将软件作者的文档贴了过来,说明了使用方式及下载地址 Random data generator for MySQL Many times in my job I need to generate random data for a specific table in order to reproduce an is…

2023.10 秋爽版 java 软件授权激活 架构 java代码混淆 按日期授权 不联网

什么是代码混淆? 代码混淆是一种技术,用于在不改变代码功能的情况下,通过改变代码的结构和逻辑,使之变得更难理解和分析,从而增加反向工程的难度。 为什么要进行代码混淆? 在Java应用程序中,…

MyBatisPlus(十七)通用枚举

说明 MyBatisPlus 优雅地使用枚举类型。 声明通用枚举属性 使用 EnumValue 注解枚举属性 package com.example.web.enumeration;import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonValue; import lombok.AllArgsConstru…

安装Android SDK点击SDK Manager.exe一闪而退完美解决方案

如上图,我们点击 “SDK Manager.exe” 总是一闪而退。 1.查看提示说Detect whether Java SE Development Kit is installed,检查你的JDK是否安装。 2.在cmd里看了,java -version 和javac -version都是有显示版本的。说明安装以及环境配置成…

ES6介绍

1:ES6声明变量 1.变量var声明变量的问题 ES5 可以重复声明变量可以先使用再声明造成全局变量污染 2.let声明变量特点 ES6 不能先使用再说明不能重复定义一个变量具有块级作用域 3.const声明变量特点 ES6 不能先使用再说明一旦声明必须赋值赋值之后不能修改具有块级…

0144 文件管理

目录 4.文件管理 4.1文件系统基础 4.2目录 4.3文件系统 部分习题 4.文件管理 4.1文件系统基础 4.2目录 4.3文件系统 部分习题 1.UNIX操作系统忠,输入/输出设备视为() A.普通文件 B.目录文件 C.索引文件 D.特殊文…

cesium 地图蒙版遮罩效果

示例代码 <!DOCTYPE html> <html lang"en"><head><!-- Use correct character set. --><meta charset"utf-8" /><!-- Tell IE to use the latest, best version. --><meta http-equiv"X-UA-Compatible"…

快速排序 ← PPT

【算法代码】https://blog.csdn.net/hnjzsyjyj/article/details/127825125

JavaScript (下)

1.面向对象 在 Java 中我们学习过面向对象&#xff0c;核心思想是万物皆对象。在 JavaScript 中同样也有面向对象。思想类似。 把相关的数据和方法组织为一个整体来看待&#xff0c;从更高的层次来进行系统建模&#xff0c;更贴近事物的自然运行模式 1.类的定义和使用 格式…

Java二叉树超详解(常用方法介绍)(2)

二叉树中的常用方法 静态二叉树的手动创建 这里我们先给出二叉树结点的信息(这里是内部类)&#xff1a; static class TreeNode {public char val;public TreeNode left;//左孩子的引用public TreeNode right;//右孩子的引用public TreeNode(char val) {this.val val;}} 手动…

嵌入式系统开发【深入浅出】 UART 与 USART

目录 UART: 通用串行异步收发器 串行通信的时序 8N1&#xff1a;8位数据位 N没有校验位 1停止位1位 中断控制 编程重点 引言&#xff1a; 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式&#xff0c;并且大部分电子设备都支持该通讯方式&#xff0c;也…

TensorFlow入门(二十一、softmax算法与损失函数)

在实际使用softmax计算loss时,有一些关键地方与具体用法需要注意: 交叉熵是十分常用的,且在TensorFlow中被封装成了多个版本。多版本中,有的公式里直接带了交叉熵,有的需要自己单独手写公式求出。如果区分不清楚,在构建模型时,一旦出现问题将很难分析是模型的问题还是交叉熵的使…

【 数据结构:堆(Heap)】大根堆、小根堆、堆的向上调整算法、向下调整算法 及 堆的功能实现!

前言 本系列文章【数据结构】默认会使用 C/C 进行设计实现&#xff01;其他语言的实现方式请参照分析设计思路自行实现&#xff01; 注[1]&#xff1a;文章属于学习总结&#xff0c;相对于课本教材而言&#xff0c;不具有相应顺序性&#xff01;&#xff08;可在合集中自行查看…

C++: 继承

学习目标 1.继承的概念及定义 2.基类和派生类对象赋值转换(切片) 3.继承中的作用域(隐藏/重定义) 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.菱形继承与菱形虚拟继承 8.总结 1.继承的概念及定义 1.1概念 继承: 它允许你创建一个新的类&#xff08;称为子类或派…

小程序uView2.X框架upload组件上传方法总结+避坑

呈现效果: 1.1单图片上传 1.2多图片上传 前言:相信很多人写小程序会用到uView框架,总体感觉还算OK吧,只能这么说,肯定也会遇到图片视频上传,如果用到这个upload组件相信你,肯定遇到各种各样的问题,这是我个人总结的单图片和多图片上传方法. uView2.X框架:uView 2.0 - 全面兼容…