操作系统——进程与线程(死锁)

news2024/11/14 12:20:07

1)为什么会产生死锁?产生死锁有什么条件?

2)有什么办法解决死锁?

一、死锁

死锁:多个程序因竞争资源而造成的一种僵局(互相等待对方手里的资源),使得各个进程都被阻塞,若无外力干涉,这些进程都无法向前推进。

就好比:一座桥上,一次性只能一辆汽车通过,这时两辆汽车分别都占据了桥的左右两边,都等着对方后退,而导致两辆汽车都无法前进。

死锁状态是指每个进程都在等待一个事件,而该事件只可能由组织内的一个进程产生。

饥饿的主要原因:当系统中有多个进程同时申请某类资源时,由分配策略分配给进程的次序,有的分配策略可能是不公平的,即不能保证等待时间上界的存在。

饥饿并不代表锁死,但至少有一个进程的执行是被无限期推迟的,而死锁至少说两个或两个以上的进程。

死锁和饥饿的差别:

1.发生饥饿的进程可以只有一个,而死锁是因为循环等待对方手里的资源导致的,因此如果有死锁现象,那么发生死锁的进程就必然大于或等于两个。

2.发生饥饿的进程可能处于就绪态(长期得不到CPU,如SJF短作业优先算法的问题),也可能处于阻塞态(如长期得不到所需的I/O设备)而发生死锁的进程必定处于阻塞态

死锁产生的原因:

1)系统资源的竞争

通常系统中拥有的不可剥夺资源(如打印机,磁带机),其数量不可以满足多个进程运行的需要,使得进程在运行的过程中,会因争夺资源而陷入僵局。

只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源竞争(如CPU和主存)不会引起死锁。

2)进程推进顺序非法

请求和释放资源的顺序不当就会导致死锁。eg:进程a和b分别保持了资源e和f,而a申请了资源f,b申请了资源e,两者都会因为所需资源被占用而阻塞,就导致死锁。

信号量使用不当也会导致死锁。进程间彼此相互等待对方发来的信息,也会导致进程无法继续向前推进。

死锁产生的必要条件:

1)互斥条件:即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

2)不可剥夺条件:进程所获得的资源在未使用完前,不能被强行夺走,只能由进程自己来释放这个资源(只能是自动释放)。

3)请求并保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源被别的进程占有,此时请求资源的进程就只能被阻塞,但对自己以获得的资源又保持不放。

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

如:

每种资源只有一个,并出现了环路,可以确定出现了死锁。

但是又如当一个游离在循环等待队列之外的另一个进程手握资源出现时,就会打破这一死锁现象:

二、死锁的处理策略

1)死锁预防

四个死锁的必要条件中,无法破坏的是互斥使用资源(有些资源根本就不能被同时访问,如打印机就只能互斥使用,使用不能被破坏)

预防死锁的发生只需要破坏死锁产生的4个必要条件之一即可。

1.破坏互斥条件

如果互斥使用的资源改为运行共享使用,那么就不会进入死锁状态。但是有些资源根本不能同时访问,如打印机等临界资源只能互斥使用,所以破坏互斥条件而预防死锁的方法不太可行,为了系统安全很多时候都必须要保护这种互斥性。(但现在也有程序,能让进程假装认为进程可以连续不断的在打印机上工作,其实只是程序替进程保存了这些打印任务)

2.破坏不可剥夺条件

当一个已经保持了某些不可剥夺资源的进程,请求新的资源而得不到满足,他就必须释放已经保持的所有资源,待以后需要时在重新申请。这就意味着,进程已占有的资源会被暂时释放,或者是被剥夺了,从而破坏了不可剥夺条件。

但是该策略实现起来比较复杂。释放已获得的资源可能造成前一阶段的工作失效,因此这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。反复申请和释放资源即影响进程推进速度,又增加系统开销,进而降低系统吞吐量。

3.破坏请求并保持条件

1)采用预先静态分配法,即进程在运行前,一次申请完它所需要的全部资源,在他的资源未满足前,不让它投入运行。在进程运行期间,不会再提出资源请求,从而破坏请求条件。在等待期间,进程不占有任何资源,破坏了保持条件。

缺点:可能导致饥饿,个别资源长期被别的进程占用将导致等待该资源的进程迟迟不能开始。

2)允许进程只获得初期所需要的资源后,便可开始运行。进程在运行过程中再逐步释放已分配给自己且已使用完毕的全部资源后,才能请求新的资源。

4.破坏循环等待条件

为了破坏循环等待条件,可以采用顺序资源分配法。给系统中的各类资源进行编号,只有小编号资源才有资格申请大编号资源,这样就不会产生循环等待的现象。

缺点:编号必须相对稳定,因此不便于增加新的类型设备。按规定次序申请编号资源,还会给用户编程带来麻烦。

2)死锁避免

1.安全状态:系统能按某种进程推进,为每个进程pi分配其所需资源,直到满足每个进程对资源的 最大需求,使每个资源都可以顺利完成。此时称为安全序列,否则就叫做不安全状态。

2.银行家算法任何时刻都能保证至少有一个进程可以得到所需的全部资源

1)Available:系统中有K个R类资源可用

2)Max:系统中R类资源最大数目为K

3)Allocation:表示进程已经分配R类资源的数目为K

4)Need:表示该进程还需要R类资源的数目为K

Need=Max-Allocation

做一题,就什么都明白了!~

三、死锁检测和解除

用圆圈表示一个进程,用框表示一类资源,框中的一个圆表示一类资源中的一个资源。

从进程到资源的有向边称为请求边,表示进程申请一个单位的该类资源;

从资源到进程的边称为分配边,表示已有一个资源分配给该进程。

如图就是p1可以被r2分配一个资源,从而消除p1的所有边,然后此时r1就会有空闲的两个资源可以被分配,其中p2已经请求一个资源让r1分配,那么当r1分配给p2时,p2也会结束所有关于它的边请求和分配任务。

此时加入p3,让r2分配了一个资源给p3,导致只有p3能被正常结束,p1和p2都会缺少r1与r2分配给他们的资源,其中,要消掉关于p1和p2进程,必须要有r1和r2中额外多出的资源来将p1和p2的请求给消除掉。

重点:

死锁公式:资源数大于进程个数乘以“每个进程需要的最大资源数减1”就不会发生死锁,

即m>n*(w-1);其中m是磁带机的数量,n是进程的数量,w是每个进程最多请求的磁带机数量

eg:某系统有n台互斥使用的同类设备,三个并发进程分别需要3,4,5台设备,可确保系统不发生死锁的设备数n最小为多少?

根据死锁公式,当资源数量大于个进程所需资源数-1的总和时,不发生死锁,三个进程分别需要3,4,5台设备,那么当资源数大于(3-1)+(4-1)+(5-1)=9时,不发生死锁,而当系统中只有9台设备时,当一个进程分配2台,第二个3台,第三个4台情况下,三个进程都无法继续执行下去,发生死锁,当系统再增加一台设备后,任意一个进程都可以顺利进行,因此不小于10台。

1)为什么会产生死锁?产生死锁有什么条件?

由于系统中存在一些不可剥夺资源,当两个或两个以上的进程占有自身资源并请求对方的资源的时候,会导致每个进程都无法向前推进,就是死锁。

死锁产生的必要条件有四个:互斥条件,不剥夺条件,请求并保持条件,循环等待条件。

2)有什么办法解决死锁?

死锁的处理策略有:预防死锁,避免死锁和死锁的检测与解除。

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

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

相关文章

02.C++入门基础(下)

1.函数重载 C支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。 1、参数类型不同 2、参数个数不同…

volatile,最轻量的同步机制

目录 一、volatile 二、如何使用? 三、volatile关键字能代替synchronized关键字吗? 四、总结: 还是老样子,先来看一段代码: 我们先由我们自己的常规思路分析一下代码:子线程中,一直循环&…

DocRED数据集

DocRED数据集文件夹包含多个JSON文件,每个文件都有不同的用途。以下是这些文件的用途解释以及哪个文件是训练集: 文件解释 dev.json:包含开发集(验证集)的数据,通常用于模型调优和选择超参数。 label_map…

java面向对象进阶进阶篇--《包和final》

一、前言 今天还是面向对象相关知识点的分享,包是写小型项目时不可或缺的存在,final关键字用的地方不算太多。idea会提示我们导包,有时会自动导包,确实十分方便。但是我们也不能不会自己去导包。 面向对象篇不出意外的话本周就要…

【线性代数】矩阵变换

一些特殊的矩阵 一,对角矩阵 1,什么是对角矩阵 表示将矩阵进行伸缩(反射)变换,仅沿坐标轴方向伸缩(反射)变换。 2,对角矩阵可分解为多个F1矩阵,如下: 二&a…

python打包exe文件-实现记录

1、使用pyinstaller库 安装库: pip install pyinstaller打包命令标注主入库程序: pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题: 通过添加--hidden-importcomtypes.strea…

“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对

“微软蓝屏”事件暴露了网络安全哪些问题? 近日,一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅成为科技领域的热点新闻,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件,源于美国电脑安全…

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

全网最全最详细的C++23 标准详解:核心语言改进与新特性

1. 简介 C23 是由 C 标准委员会最新发布的标准,旨在进一步提升 C 语言的功能和开发效率。作为一项重要的编程语言标准更新,C23 引入了多个关键的新特性和改进,使开发者能够编写更高效、简洁和安全的代码。 与 C20 相比,C23 的变…

3112.力扣每日一题7/18 Java 迪杰斯特拉(Dijkstra)算法

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 迪杰斯特拉(Dijkstra)算法 解题思路 解题过…

C++学习指南(三)——模板

欢迎来到繁星的CSDN。本期内容主要包括模板template。 目录 一、什么是模板? 二、函数模板 模板的定义方式 模板的实例化(确定参数的类型) 隐式实例化 显式实例化 实例化顺序 三、类模板和模板类 类模板的实例化 一、什么是模板&#xff1…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中,校园招聘会的出现,为学生们提供了一个展示自我、探寻职业道路的舞台,同时也为企业搭建了一座直面未来之星的桥梁。这一功能,凭借其独特的优势与前沿的技术,正在重新定义校园与职场之间的过…

2024中国大学生算法设计超级联赛(1)

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,彩笔ACMer一枚。 🏀所属专栏:杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 📢📢📢传送门 A - 循环位移解…

python-爬虫实例(5):将进酒,杯莫停!

目录 前言 将进酒,杯莫停! 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批,当然要尝试爬取王者荣耀的东西啦。 将进…

萝卜快跑突然就火了,背后发生了什么?

近日,百度旗下的自动驾驶出行平台“萝卜快跑”突然在网络上火了起来,成为热门话题。那么,这背后到底发生了什么? 1. 数字误传引发热议 首先,一些误传的数字在传播中起到了推波助澜的作用。例如,百度在2023…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

PCL 批量处理点云文件

系列文章目录 文章目录 系列文章目录前言一、PCL是什么?二、配置PCL环境三、使用步骤1.引入库2.主函数 总结 前言 点云处理时往往会需要对多个点云进行处理,比如在预处理,保存点云时。下面提供一个简单的点云批量转换例子,PCD文件…

MongoDB 文档存储

安装 下载: Download MongoDB Community Server | MongoDB 说明: 现在基本都安装的是4.4以后的版本。安装完成后使用 mongod 来查看是否安装成功 会输出一堆内容 而如果想要操作数据库,则需要安装一个工具,mongosh-2.2.12-x64.m…

JavaSE从零开始到精通(七) - Stream流

1. 概述 Java 8引入了Stream API,它提供了一种高效且易于使用的处理集合数据的方式。Stream流可以被认为是一种高级的迭代器,允许我们在集合上进行复杂的操作,例如过滤、映射、排序、归约等,而这些操作可以链式调用,形…

C# 开发监控方法执行耗时

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调…