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

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.mzph.cn/pingmian/49095.shtml

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

相关文章

一篇文章搞懂MySQL的事务与隔离级别

事务 概述 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元。要么同时成功,要么同时失败,不可再分 假设转账,从A账户向B账户转账10000 A账户的钱减去10000(update语句) B账户的钱加上10000&…

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为,需要提前获取用户授权,或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…

无需抠图!AI绘画直接文本生成透明底图层,设计师必看的ComfyUI透明图层生成工作流教程!(附插件模型)

大家好,我是画画的小强 AI 绘画自出现以来一直都在不断发展完善,实现了很多我们在实际应用中迫切需要的功能,比如生成正确的手指、指定的姿势、准确的文本内容等。上周,又一个重磅新功能在开源的 SD 生态内实现了——直接通过文本…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十四章 注册字符设备号

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

Springboot项目打包成镜像、使用docker-compose启动

Springboot项目打包成镜像、使用docker-compose启动 1、创建一个boot项目 1、添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…

gitee的怎么上传项目

前提 1.先下载Git Bash (如果没有下载的宝子们下载连接如下: 链接: link ) 项目上传到Gitee步骤 1.在Gitee上建立远程仓库 2.填写相关信息 3.进入本地你想要上传的文件目录下&#xff0c;右键单击空白处&#xff0c;点击Git Bash Here 4.配置你的用户名和邮箱 git con…

【leetcode】排列序列

给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213""231""312""321" 给定…

最简单的typora+gitee+picgo配置图床

typoragiteepicgo图床 你是否因为管理图片而感到头大&#xff1f;是时候了解一下 Typora、Gitee 和 PicGo 这个超级三剑客了&#xff0c;它们可以帮你轻松打造自己的图床&#xff0c;让你的博客图片管理变得简单又有趣。让我们开始这场神奇的图床之旅吧&#xff01; Typora …

7.20 模拟赛总结 [邻项交换] + [决策单调性]

只放题解喽 题解 T1T2T3T4 T1 等价于维护差分数组&#xff0c;数据范围较小&#xff0c;map 套 vector 维护即可 更大的数据范围可以 hash 做 T2 神奇贪心 本题关键在于定序&#xff0c;考虑顺序确定后答案怎么求 设 f i f_i fi​ 表示 第 i i i 件衣服烘干完的时间&…

运放构成电压跟随器,反馈电阻作用;运放电流采集电路,单电源供电,TINA仿真

电压跟随器 使用运放构成电压跟随器可以减小负载对信号源的影响&#xff0c;还可以提高信号带负载的能力&#xff0c;这是因为运放的结构特性&#xff0c;输入电阻大&#xff0c;输出电阻小。 是否决定使用该电压跟随器&#xff0c;就要看信号源&#xff0c;以及负载的阻抗大小…

【视觉SLAM】 十四讲ch5习题

1.*寻找一个相机&#xff08;你手机或笔记本的摄像头即可&#xff09;&#xff0c;标定它的内参。你可能会用到标定板&#xff0c;或者自己打印一张标定用的棋盘格。 参考我之前写过的这篇博客&#xff1a;【OpenCV】 相机标定 calibrateCamera Code来源是《学习OpenCV3》18.…

kaggle竞赛宝典 | 时序表示学习的综述!

本文来源公众号“kaggle竞赛宝典”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;时序表示学习的综述! 1 介绍 本文综述了时间序列数据中的通用表示学习方法&#xff0c;提出了一种新颖的分类方法&#xff0c;并讨论了其对提高…

【区块链+绿色低碳】巴中市生态价值核算创新应用 | FISCO BCOS应用案例

生态产品总值&#xff08;GEP&#xff09;&#xff0c;指一定区域生态系统为人类福祉和经济社会可持续发展提供的产品与服务价值总和&#xff0c;包 括供给产品价值、调节服务价值和文化服务价值。当前&#xff0c;推动生态产品价值有效转化存在“难度量、难抵押、难交易、 难变…

【手撕数据结构】拿捏单链表

目录 单链表介绍链表的初始化打印链表增加节点尾插头插再给定位置之后插入在给定位置之前插入 删除节点尾删头删删除给定位置的节点删除给定位置之后的节点 查找节点 单链表介绍 单链表也叫做无头单向非循环链表&#xff0c;链表也是一种线性结构。他在逻辑结构上一定连续&…

(Qt) 文件读写基础

文章目录 &#x1f5c2;️前言&#x1f4c4;ref&#x1f4c4;访问标记&#x1f5c3;️enum 标记 &#x1f5c2;️Code&#x1f4c4;demo&#x1f4c4;分点讲解&#x1f5c3;️继承体系&#x1f5c3;️打开/关闭&#x1f5c3;️写&#x1f5c3;️读 &#x1f5c2;️END&#x1f…

Java并发的笔记

打算记录自己的学习情况&#xff0c;尽量不摆烂&#xff0c;另外一件事要有始有终&#xff0c;要弄完 如果多个线程处理同一个变量&#xff0c;读跟写都保证不了 2024.7.22》》》》》》》》》》》》 2.1.1volatile的实现原理 volatile不会引起线程上下文的切换和调度 一致性更…

pycharm+pyqt6配置

1、pip install pyqt6 pyqt6-toools 2、pycharm配置 配置&#xff1a;designer Program&#xff1a;&#xff1a;D:\Python39\Lib\site-packages\qt6_applications\Qt\bin\designer.exe Working directory: $ProjectFileDir$ 配置&#xff1a;pyuic6.exe Program&#xff1a…

调度子系统在特定时间执行

时序逻辑调度器设计模式允许您安排Simulink子系统在指定时间执行。以下模型说明了这种设计模式。 时序逻辑调度器图表包含以下逻辑&#xff1a; 时序逻辑调度器的关键行为 时序逻辑调度器图表包含两个状态&#xff0c;它们以不同的速率调度函数调用子系统A1、A2和A3的执行&…

DVWA靶场超(详细教程)--跨站攻击(XSS+CSRF)

一、XSS 反射型xss 打开dvwa的Reflected Cross Site Scripting (XSS) &#xff08;1&#xff09;low等级 查看页面源码&#xff08;ctrlu&#xff09;该界面有提交按钮和输入框 在输入框随便输入点字符&#xff0c;点击提交 可以看见输入的helloword嵌入到界面中。 View sou…

PS启动提示Adobe Creative Cloud丢失或损坏。您可以尝试修复来解决这个问题,如何解决

一般为找到这个路径下C:\Program Files (x86)\Common Files\Adobe\Adobe Desktop Common\ADS的Adobe Desktop Service.exe文件。如果不在C盘也可以直接搜索其他盘找到此文件。 直接删除此文件即可解决&#xff0c;如果删除不了可以进任务管理器先结束进程再删除。鼠标右键结束任…