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

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学习】用户文件访问

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

Web开发:属性

属性 介绍全局属性特定元素属性超链接元素 (< a >)图像元素 (< img >)输入元素 (< input >)表单元素 (< form >)表格元素 (< table >) 其他元素段落元素 (< p >)列表元素 (< ul >, < ol >, < li >) 新增的HTML5属性示例…

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

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

PyCharm中的版本控制大师:Git的高效应用

PyCharm中的版本控制大师&#xff1a;Git的高效应用 在软件开发中&#xff0c;版本控制是一个不可或缺的工具&#xff0c;它帮助开发者管理代码变更、跟踪历史和协同工作。Git是目前最流行的版本控制系统之一&#xff0c;而PyCharm&#xff0c;作为一款功能强大的集成开发环境…

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

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;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…

什么是保费保额,什么是豁免条款

保额1000万和300万的保费具体数额会因多种因素而异&#xff0c;包括保险公司的不同、保险产品的类型、被保险人的年龄、性别、健康状况、生活习惯&#xff08;如是否吸烟&#xff09;等。因此&#xff0c;没有统一的保费标准。 保费的计算通常涉及以下几个因素&#xff1a; 风…

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 …

20-c语言main函数参数`argc` 和 `argv[]` 解析

argc 和 argv[] 解析 argc 和 argv[] 是 main 函数的参数&#xff0c;用于处理命令行参数。 一、 示例命令行调用 ./a.out 123 345解释&#xff1a; ./a.out 是程序名&#xff0c;也是第一个参数。123 和 345 是运行时传递的额外参数。 二、main 函数定义 int main(int a…

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

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

Result of ‘BigDecimal.setScale()‘ is ignored

在Java中&#xff0c;BigDecimal.setScale() 方法用于格式化小数点后的位数&#xff0c;并可以选择舍入模式。如果你看到 "Result of BigDecimal.setScale() is ignored" 这样的警告&#xff0c;可能是因为你调用了 setScale() 方法&#xff0c;但没有将返回的新 Big…

Linux内核处理系统调用过程

Linux内核处理系统调用的过程是操作系统中一个非常关键的部分&#xff0c;它允许用户空间的程序请求内核提供的服务。以下是系统调用处理的一般步骤和概念&#xff1a; 1. **用户空间到内核空间的切换**&#xff1a; - 用户空间的程序通过执行系统调用指令&#xff08;如in…

arm、AArch64、x86、amd64、x86_64 的区别

arm vs AArch64 vs amd64 vs x86_64 vs x86 的区别 当涉及到 CPU 的时候&#xff0c;有许多术语&#xff1a;AArch64、x86_64、amd64、arm 等等。了解它们是什么以及它们之间的区别。 当你查看数据表或软件下载页面时是否被 ARM、AArch64、x86_64、i386 等术语混淆&#xff1f;…

运放构成电压跟随器,反馈电阻作用;运放电流采集电路,单电源供电,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;并讨论了其对提高…

闪电般的代码提示:在PyCharm中消灭延迟

闪电般的代码提示&#xff1a;在PyCharm中消灭延迟 PyCharm是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了代码提示、自动完成等功能&#xff0c;极大地提高了开发效率。然而&#xff0c;在处理大型项目或复杂代码库时&#xff0c;代码提示可能…