操作系统--死锁

目录

说明使用互斥锁时死锁是如何发生的。

系统模型:

死锁的特性:

处理死锁的方法:

死锁的预防:

死锁避免:

说明使用互斥锁时死锁是如何发生的。

我们先来看一个例子:
当两列火车在十字路口逼近时,它们要完全停下来,且在一列火车开走之前,另一辆火车不能启动。

系统模型:

资源类型的例子:CPU周期,内存空间,I/O设备。
每种资源类型Ri有Wi个实例。
每个进程按如下方式利用资源:
1,申请。
2,使用。
3,释放。

死锁的定义:当一组进程中的每一个进程都在等待一个事件,而这个事件只能由这组进程中的另一个进程引起,那么这组进程就处于死锁状态。

死锁是指多个进程因竞争系统资源或相互通信而造成的一种僵局,若无外力作用,这些进程都将永远不能向前推进。

例子:假设一条河上有一座独木桥,若桥两端人相向而行。死锁就会发生。

死锁的特性:

死锁产生的原因与资源的使用相关,下面介绍资源的分类。
资源包括可剥夺资源和不可剥夺资源,有点类似于抢占式和 非抢占式。
可剥夺资源:是指某进程获得这类资源后,该资源可以被其他进程或系统剥夺,如CPU,存储器。
不可剥夺资源:又称为非剥夺资源,是指系统将这类资源分配出去之后,再不能强行收回,只能等进程结束后主动释放,如打印机,读卡机。

注意:竞争可剥夺资源不会发生死锁。

永久性资源:可顺序重复使用的资源,如打印机。
消耗性资源:有一个进程产生,被另一个进程使用的短暂时间后便无法使用的资源,又称为临时性资源,如消息。

竞争永久性资源和临时性资源都有可能发生死锁。

死锁产生的原因:
竞争资源:多个进程竞争资源,而资源又不能同时满足其需求。
进程推进顺序不当:进程申请资源和释放资源的顺序不当。

下面给出竞争非剥夺资源引起的死锁:

如消息通信按下述顺序进行,则不会发生死锁:
P1:...Release(S1);Request(S2);...
P2:...Release(S2);Request(S1);...
若按下述顺序,则可能发生死锁:
P1:... Request(S2);Release(S1);...
P2:... Request(S1);Release(S2);...

显然,若两者都是先释放再请求,就不会发生死锁,但是要是先请求,显然是得不到对方已经持有的资源。

显然,造成死锁的原因就是资源有限,而进程顺序相矛盾。

互斥:一次只有一个进程能使用一个资源。
占有并等待:一个至少持有一个资源的进程等待获得另外的资源,而该资源由其他进程所持有。
非抢占:资源不能被抢占,即资源只能在进程完成任务后自动释放。
循环等待:等待资源的进程之间存在环。

死锁产生的必要条件:
互斥条件:在一段时间内某个资源仅被一个进程所占有。
请求和保持条件:又称为部分分配条件,当进程因请求资源被阻塞时,已分配的资源保持不放。
不剥夺条件:进程所获得的资源在未被使用完毕之前,不能被其他进程强行夺走。
循环等待条件:死锁发生时,存在一个进程资源的循环。

死锁是因为资源竞争造成的僵局。
通常死锁至少涉及两个进程。
死锁与部分进程及资源相关。

资源分配图有一个节点集合V和一个边集合E组成,V被分为两部分:系统中的进程集合P,系统中的资源集合R。请求边是:Pi->Ri,分配边:Ri->Pi。

图中圆形表示进程Pi,方框表示资源类型Ri,在方框中用原点表示实例。

可以证明:如果资源分配图中没有环,那么系统就没有进程死锁,如果分配图中存在环,那么就有可能死锁。

显然,这个就有可能存在死锁,R2的资源全都被持有,而P3还要请求R2的资源,要等P2或P1执行完释放,而P1释放首先要请求R1,而R1被P2所持有,所以要先等P2释放,P2释放首先要请求R3,而R3被P3所持有,所以首先要等到P3释放,但是在请求到R2的资源之前,P3不能完成进程,不能完成进程就不能释放资源,总结起来就是P3请求R2资源的必要条件是P3已经拥有R2的资源,显然自相矛盾,故会被死锁。

但是有环也不一定是死锁,如下图:

由于P4持有资源R2,而P4又不请求什么资源,所以P4执行完自动释放持有的一个R2资源,P2同理,这时R1,R2资源充足,对所有请求都能及时回应。

处理死锁的方法:

有三种方法可以处理死锁:
通过协议预防或避免死锁。
允许系统进入死锁状态,然后检测它并恢复系统。
忽略这个问题。

第三种方法被大多数操作系统所使用,包括UNIX和Windows。

用于处理死锁的方法主要有:
忽略死锁:这种处理方式又称为鸵鸟算法,指像鸵鸟一样对死锁视而不见。
预防死锁:设置某些限制条件,通过破坏死锁产生的四个必要条件之一来预防死锁。
避免死锁:在资源的动态分配过程中,用某种方法来防止系统进入不安全状态。

死锁的预防:

只要确保至少有一个必要条件不成立,就能预防死锁发生。
预防死锁的特点是:较易实现,广泛使用,但是限制较严,资源利用率低。

互斥:

通常不能通过否定互斥条件来预防死锁,有的资源本身就是非共享的。
互斥是设备本身固有的属性,此条件不能被破坏。

占有并等待:

必须保证进程申请资源的时候没有占有其他资源。

要求进程在执行前一次申请全部的资源,或只有没有占有资源时才可以分配资源。

资源利用率低,可能出现饥饿。

破坏请求和保持条件:

要求进程一次申请他所需的全部资源,若有足够的资源则分配给进程,否则不分配资源,进程等待,这种方法被称之为分配法。
特点是:简单,安全且易于实现,但是资源利用率低,进程延迟运行。

非抢占:

如果一个进程占有资源并申请另外一个不能立即分配的资源,那么其现在已经分配的资源都可以被抢占。
该协议通常应用于状态可以保存和恢复的资源,例如CPU寄存器,内存。

破坏不剥夺条件:

一个应景获得某种资源的进程,如果新的资源请求得不到满足,则它必须释放已获得的所有资源。
特点是:实现较复杂,释放已获得的资源可能造成前一段时间工作失效,重复申请和释放资源会增加系统开销,降低系统吞吐量。

循环等待:

对所有资源类型进行完全排序,且要求进程按照递增顺序来申请资源。

破坏循环等待条件:

将所有资源按照类型排队,并赋予不同序号,要求进程均严格按照序号递增的书序请求资源,同类资源一次申请完,这种方法称之为资源的有序分配法。
特点是:比前两种方法资源利用率高,吞吐量大,但要求资源序号相对稳定,从而限制了新设备的增加,使用资源的顺序与系统规定的顺序不同,造成资源的浪费,使用资源的次序限制用户编程。

为什么有序分配资源不存在环:

采用有序资源分配,系统必须按照资源编号升序进行申请资源。
因此在任意时刻,系统中总存在一个进程,它占有已申请资源中编号最高的资源,且它继续申请的资源必定是空闲的,因而它可以一直向前推进直到完成。

当该进程完成后,即释放它所占有的全部资源,这样剩余的进程集合中又会存在一个进程,它占有已申请资源中编号最高的资源,且它继续请求的资源必定是空闲的,因而它也可以一直推进直到完成任务。

以此类推,最终所有进程均可以运行完成,故不会发生死锁。

死锁避免:

死锁避免算法动态检查资源分配以确保不会出现循环等待的情况。
资源分配状态由可用资源,已分配资源和进程所需的最大资源数量定义。

死锁的避免是在动态分配的过程中,用于某种方法防止系统进入不安全状态,从而避免死锁的发生。
特点是:以较弱的限制获得较高的利用率,但实现由一定的难度。

我们看一下什么是安全状态:

如果每个进程Pi所申请的资源数可以由当前可用资源数加上其他所有进程Pj(j<i)所持有的该资源数的和来满足,则进程序列<P1, P2, …, Pn>是安全的。

在避免死锁的方法中,允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程等待。

安全状态是指系统能按某种顺序如< P1、P2… 、Pn>来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利完成,则称此时的系统状态为安全状态,称序列< P1、P2、…、Pn >为安全序列。

若不存在一个安全序列,则称系统状态为不安全状态。
安全状态不是死锁状态,死锁状态是不安全状态。

关系图大致如下:

我们看一个安全状态的例子:

这是安全状态:

P1需要2个资源,现在空闲的资源有3个,P1可以申请得到,然后执行完P1之后释放资源,空闲资源现在有5个,P0申请可以获得资源,然后P0执行,执行完之后释放资源,则目前资源数量是10,p2申请可以获得所需的资源,然后P2执行。

明显<P1,P0,P2>满足安全条件。

最具代表性的死锁避免算法是DIjkstra的银行家算法。
每一个进程必须事先声明资源的最大使用量。
当用户申请一组资源时,系统必须确定这些资源的分配是否会使系统处于安全状态,如果是就可以分配资源,否则等待。

下一节讲银行家算法,今天先到此为止,陪天佑去吃烧烤。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux忘记mysql的root密码,强制修改

1、登录linux后编辑mysql的配置文件&#xff1a;vi /etc/my.cnf 2、添加如下代码&#xff0c;表示跳过授权表登录mysql 编辑完成后&#xff0c;按Esc键&#xff0c;":wq"退出编辑并保存修改内容。 3、使用命令&#xff1a;service mysqld restart 重启mysql服务. …

【No.21】蓝桥杯组合数学|数位排序|加法计数原理|乘法计数原理|排列数|组合数|抽屉原理|小蓝吃糖果|二项式定理|杨辉三角|归并排序(C++)

组合数学 数位排序 【问题描述】 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如,2022 排在 409 前面, 因为 2022 的数位之和是 6,小于 409 的数位 之和 13。…

【Web应用技术基础】JavaScript(1)——案例:猜数字

上一个博客发了视频。这个博客因为不能插入视频&#xff0c;所以给大家一张一张截图的 点击“重新开始一局游戏” <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"…

Java类与对象:从概念到实践的全景解析!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、类的定义格式 在java中定义类时需要用到…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式&#xff1a;使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…

matlab 点云可视化(6)——点云按强度进行可视化

目录 一、功能概述1、算法概述2、主要函数二、代码示例三、结果展示四、参考链接本文由CSDN点云侠原创原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、功能概述 1、算法概述 点云按强度进行可视化 2、主要函数

Request和Response

Request&#xff08;请求&#xff09;&Response&#xff08;响应&#xff09; Request&#xff1a;获取请求数据 Response&#xff1a;设置响应数据 Request继承体系 1.Tomcat需要解析请求数据&#xff0c;封装为request对象&#xff0c;并且创建request对象传递到servic…

分治实现快速排序和归并排序

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 一.快速排序&#xff08;升序为例&#xff09; 思想&#xff1a;确定分界点x&#xff0c;将小于分界点的值放在分界点的左边&#xff0c;将大于分界定的值放在分界点的右边&#xff0c;再递归处理两边的左右区间。 步骤&am…

HR应用人才测评开展招聘,可以显著提升效率

某汽车零部件武汉有限公司诚聘库管员1名…… 孟X毅&#xff0c;男&#xff0c;29岁,市场营销专业,做过生产主管,求一份白班工作。 王X宸&#xff0c;女&#xff0c;22岁&#xff0c;有一年会计经验&#xff0c;求相似工作。 张汉X&#xff0c;男&#xff0c;31岁&#xf…

Python程序怎么打包成exe文件

前言 pyinstaller可以将.py文件打包成.exe可执行文件&#xff0c;即使别人的电脑上没有搭建Python环境&#xff0c;也是可以直接运行程序的。 pyinstaller安装 首先打开cmd&#xff0c;在里面输入下面这一行命令&#xff0c;回车即可。 pip install pyinstaller 我运行命令…

TR2 - Transformer模型的复现

目录 理论知识模型结构结构分解黑盒两大模块块级结构编码器的组成解码器的组成 模型实现多头自注意力块前馈网络块位置编码编码器解码器组合模型最后附上引用部分 模型效果总结与心得体会 理论知识 Transformer是可以用于Seq2Seq任务的一种模型&#xff0c;和Seq2Seq不冲突。 …

Echarts地图之——如何给地图添加外边框轮廓

有时候我们希望给地图外围加一圈边框来增加美感 但实际情况中&#xff0c;我们需要把国界的边框和各个省份属于国界的边框相吻合&#xff0c;否则就会造成两者看起来是错位的感觉 这就需要我们把echarts registerMap的全国省份json和国界边框json的坐标相一致。 这个json我们可…

WEPE系统安装纯净版window11教程(包含pe内系统安装方法)

目录 一.安装u盘启动盘 1.1制作安装系统引导盘 1.2下载保存windows镜像 1.3根据自己电脑品牌查询进入BIOS设置的方法 1.4我们成功进入了PE 二.重装系统 2.1遇到问题 2.2重新来到这个界面 三.PE中基本软件的作用 四.学习声明 今天不敲代码&#xff0c;今天来讲讲We P…

PetaLinux 去除自动获取 IP 地址

问题&#xff1a;系统启动的时候会自动检测 IP 地址&#xff0c;如不需要这个功能&#xff08;该过程需耗时十几秒&#xff09;。可以自定义 IP 地址&#xff0c;去掉这一步。 操作步骤如下&#xff1a; 所有命令均需在非管理员模式下执行 1. 初始化 PetaLinux 运行环境 运行…

LabVIEW车载轴承振动监测系统

LabVIEW车载轴承振动监测系统 随着汽车工业的快速发展&#xff0c;车用轴承的稳定性和可靠性对保障车辆安全运行越来越重要。目前&#xff0c;大多数车用轴承工作在恶劣的环境下&#xff0c;容易出现各种故障。开发了一种基于LabVIEW的车载轴承振动监测系统&#xff0c;提高车…

算法题:桃飘火焰焰,梨堕雪漠漠(Java贪心)

链接&#xff1a;桃飘火焰焰&#xff0c;梨堕雪漠漠 来源&#xff1a;牛客网 题目描述 在某游戏平台打折之际&#xff0c;EternityEternityEternity兴致勃勃地在该游戏平台上购买了nnn个不同的游戏&#xff0c;从1到nnn编号。 通过游览游戏论坛EternityEternityEternity确定…

# Apache SeaTunnel 究竟是什么?

作者 | Shawn Gordon 翻译 | Debra Chen 原文链接 | What the Heck is Apache SeaTunnel? 我在2023年初开始注意到Apache SeaTunnel的相关讨论&#xff0c;一直低调地关注着。该项目始于2017年&#xff0c;最初名为Waterdrop&#xff0c;在Apache DolphinScheduler的创建者…

LInux: fork()究竟是如何工作的?为何一个变量能够接受两个返回值?

LInux: fork函数究竟是如何工作的&#xff1f;为何一个变量能够接受两个返回值&#xff1f; 前言一、fork()用法二 、fork()应用实例展示三、fork()工作原理3.1 为什么要创建子进程&#xff1f;3.2 fork()究竟干了些什么&#xff1f;3.3 fork为什么会存在两个返回值&#xff1f…

文件上传漏洞-黑名单检测

黑名单检测 一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 如下图&#xff0c;定义了一个数组$deny_ext array(.a…

如何在Linux系统部署ONLYOFFICE协作办公利器并实现多人实时编辑文档

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…