2.4 操作系统死锁(死锁的概念、产生、防止、预防、避免)

2024-06-03 00:52

本文主要是介绍2.4 操作系统死锁(死锁的概念、产生、防止、预防、避免),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、死锁的概念
    • 1.1 死锁、饥饿、死循环对比
      • 1.1.1 死锁(Deadlock)
      • 1.1.2 饥饿(Starvation)
      • 1.1.3 死循环(Infinite Loop)
    • 1.2 死锁产生的条件
  • 二、预防死锁
  • 三、避免死锁
  • 四、死锁的检测和解除
    • 4.1 资源分配图和死锁定理
    • 4.2 死锁的检测和恢复

一、死锁的概念

1.1 死锁、饥饿、死循环对比

1.1.1 死锁(Deadlock)

教科书解释:
死锁是操作系统中的一种状态,指两个或多个进程在执行过程中,因争夺资源而造成的一种相互等待的现象。每个进程都占用着一些资源而又等待着其它进程所占有的资源,导致所有进程都无法向前推进,整个系统因此陷入停滞。(至少有两个及以上的进程同时发生死锁)

通俗易懂的解释
想象几个小朋友围坐一圈,每个人手里拿着一个玩具,同时又想要隔壁小朋友的玩具。没有一个小朋友愿意先放弃手中的玩具,大家都等着别人先给,结果就是所有人都没法得到新玩具,大家都不玩了。这就是死锁,每个人都卡住了,啥事也干不了。

1.1.2 饥饿(Starvation)

教科书解释
饥饿是指一个或多个进程由于系统资源分配策略的原因,无法获得足够的资源来完成其任务,尽管这些资源是可用的。长时间下来,这些进程无法取得进展,就像人长时间不吃东西会饿一样。(可能只有一个进程会发生饥饿)

通俗易懂的解释:
想象排队买冰淇淋的小朋友队伍,但是每次轮到比较高大的孩子时,他们不仅给自己买,还帮后面的朋友买,导致队伍前面的小朋友总也轮不到。那些个小一点、不够强壮的孩子就一直排在后面,可能到冰淇淋卖完都还没轮到。这些小朋友就像是“饥饿”的进程,一直得不到他们需要的资源(冰淇淋)。

1.1.3 死循环(Infinite Loop)

教科书解释:
死循环是一种编程错误,指的是程序中的一个循环结构设计不当,导致循环条件始终满足,使得程序无法自行跳出循环,一直在循环体内执行,无法继续执行后续的代码。

注意:死锁和饥饿是操作系统的问题,死循环是被管理者的问题

1.2 死锁产生的条件

互斥条件:临界资源是独占资源,只能在同一时间被同一进程独占,不能同时被多个进程共享。

想象你和朋友去图书馆借书,一本书一次只能借给一个人,不能两个人同时看同一本。

占有和等待条件:已经持有一个资源的进程可以继续请求别的资源,等待过程中不释放已有资源。

就像一些小朋友各自拿着自己的玩具,同时又想玩别人手里的玩具,他们不愿意放下手中的玩具,就在那里等待。

不剥夺条件:已获得的资源只能由进程自愿释放,不允许被其他进程剥夺。

你借到的书除非你看完了或者主动归还,管理员不能从你手上抢走给其他人,哪怕那个人急需这本书。

循环等待条件:每个进程都在等待链中等待下一个人的资源。

你等着A的书,A等着B的书,B等着C的书,而C正好等着你手里的书。这样形成了一个等待的圈,每个人都卡在那儿了。

注意:1. 死锁一定处于循环等待,循环等待不一定处于死锁
2. 对不可剥夺资源的不合理分配,可能导致死锁

二、预防死锁

破坏互斥条件:允许资源可以同时访问而非互斥使用,但在大多数情况下无法实现(写文件、键盘、磁带机……)

缺点
①实现困难②设计复杂度增加

破坏占有和等待条件: 要求进程在启动前声明它将需要的所有资源,仅当系统能够满足所有这些资源请求时才分配资源,否则进程等待直到资源齐全。

缺点
①资源利用率降低:进程可能因为一两个资源未到位就长时间等待,导致其他资源也被闲置。
②可能导致饥饿:长期等待某些资源的进程可能永远无法获取所有资源,从而饥饿。

破坏不剥夺条件:
法Ⅰ:占有资源进程若要申请新资源,必须主动释放已占用资源(剥夺式),若仍需要占用此资源,应当重新提出申请,从而破坏不剥夺条件,可能会造成进程重复地申请和释放资源。

法Ⅱ:当操作系统为某个新进程分配资源时,如果有则分配,如果没有,则将剥夺占有此资源进程的全部资源,让该进程进入等待状态。(需要考虑进程的优先级)

缺点:
①实现较复杂
②释放已有的资源可能导致前一段工作失效
③反复申请释放资源增加系统开销

破坏循环等待条件
采用层次分配策略:

  1. 资源排序与分类
    首先,对系统中的所有资源进行分类和排序,给予每个类型的资源一个唯一的标识符或编号。这个编号不一定反映资源的实际价值或重要性,而是为了确保在请求资源时有一个固定的顺序。比如,可以将资源标记为R1、R2、R3…等,按照某种逻辑(比如资源的使用频率、重要性等)排序。

  2. 进程请求资源遵循顺序
    接下来,要求每个进程在请求资源时,必须按照资源的编号顺序进行。也就是说,一个进程在已经持有R1资源的情况下,只能请求R2或编号更高的资源,而不能反向请求R0或更低编号的资源。这样做的目的是,确保进程间不会因为资源请求的交叉而导致循环等待的链条形成。

  3. 预防循环的检查机制
    在进程请求资源时,系统需要有一个检查机制,验证此次请求是否符合上述的顺序规则。如果进程试图违反顺序请求资源(比如持有R3却请求R2),请求会被拒绝,直到进程释放其持有的资源并按照正确的顺序重新发起请求。

  4. 资源分配策略
    在资源分配时,系统还需要确保资源是按照编号顺序逐步分配给进程的。一旦进程获得了某个编号的资源,它只能继续申请编号更高的资源,这在逻辑上断绝了形成闭环的可能性。

举例说明:
假设我们有三个资源类型:打印机(R1)、扫描仪(R2)、复印机(R3),并且已经按照某种逻辑进行了排序。

1.进程A首先请求并获得了打印机(R1)。

2.接着,A想要使用扫描仪(R2),此时因为它已经拥有比R2编号低的资源,所以可以顺利获取。

3.假设此时进程B正在等待打印机(R1),它不能直接跳过去请求扫描仪(R2),因为这将违反顺序原则,必须等待A释放R1。

4.这样,即使有多个进程同时运行,也不会形成如A等待B的扫描仪,B等待A的打印机这样的循环等待情况。

m个资源被n个进程共享,每个进程都要求K个资源 m > n x (k-1)一定不会发生死锁

三、避免死锁

银行家算法

四、死锁的检测和解除

4.1 资源分配图和死锁定理

资源类用方框(口)
此资源类中的各种资源用黑圈点(●)
进程用圆圈(⚪)
有向边表示进程申请和分配资源

死锁定理:如果一个系统的进程-资源分配图(进程与资源之间的关系图)是不可完全简化的,那么该系统中存在死锁

4.2 死锁的检测和恢复

资源剥夺法、进程回退法、进程撤销法、系统重启法

  1. 结束所有进程的执行并重启操作系统。(损失很大)
  2. 撤销陷于死锁的进程,解除死锁,继续运行
  3. 逐个撤销陷于死锁的进程,回收其资源并重新分派,直至死锁解除
  4. 剥夺陷于死锁的进程所占用的资源,并不撤销此进程,直至死锁解除(可能导致饥饿)
  5. 根据系统保存检查点让所有进程回退,直至死锁解除

欢迎添加我的微信公众号:Q1Hang的AI学习小屋,分享AIGC学习笔记与文章

在这里插入图片描述

这篇关于2.4 操作系统死锁(死锁的概念、产生、防止、预防、避免)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025578

相关文章

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

如何来避免FOUC

FOUC(Flash of Unstyled Content)是指在网页加载过程中,由于CSS样式加载延迟或加载顺序不当,导致页面出现短暂的无样式内容闪烁现象。为了避免FOUC,可以采取以下几种方法: 1. 优化CSS加载 内联CSS:将关键的CSS样式直接嵌入到HTML文档的<head>部分,这样可以确保在页面渲染之前样式就已经加载和应用。提前引入CSS:将CSS文件放在HTML文档的<he

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

PHP防止SQL注入详解及防范

SQL 注入是PHP应用中最常见的漏洞之一。事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞。 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。 对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的

PHP防止SQL注入的方法(2)

如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE”); DROP TA

PHP防止SQL注入的方法(1)

(1)mysql_real_escape_string – 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count(*) as ctr from users where username ='".mysql_real_escape_string($username)."' and password='". mysql_r

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控