第四章 死锁

news2024/11/16 20:52:53

目录

一、死锁的概念

1.1 什么是死锁 

1.2 死锁、饥饿、死循环的区别

1.2.1 死锁

1.2.2 饥饿

1.2.3 死循环

1.2.4 三者间的异同

1.3 死锁产生的必要条件

1.3.1 互斥条件

1.3.2 不剥夺条件

1.3.3 请求和保持条件

1.3.4 循环等待条件 

1.4 什么时候会发生死锁

1.5 死锁的处理策略

1.5.1 预防死锁

1.5.2 避免死锁

1.5.3 死锁的检测和解除

二、死锁的处理策略

2.1 预防死锁

2.1.1 破坏互斥条件

2.1.1.1 互斥条件

2.1.1.2 策略缺点

2.1.2 破坏不剥夺条件

2.1.2.1 不剥夺条件

2.1.2.2 策略缺点

2.1.3 破坏请求和保持条件

2.1.3.1 请求和保持条件

2.1.3.2 采取方法

2.1.3.3 策略缺点

2.1.4 破坏循环等待条件

2.1.4.1 循环等待条件

2.1.5.2 采取策略

2.1.5.3 策略缺点

2.2 避免死锁​编辑

2.2.1 安全序列、不安全状态、死锁的联系

2.2.2 安全性算法步骤

2.2.3 银行家算法

2.2.3.1 背景知识

2.2.3.2 核心思想

2.2.3.3 银行家算法步骤

2.3 检测和解除

2.3.1 死锁的检测

2.3.2 死锁的解除


一、死锁的概念

1.1 什么是死锁 

1.2 死锁、饥饿、死循环的区别

1.2.1 死锁

各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

1.2.2 饥饿

由于长期得不到想要的资源,某进程无法向前推进的现象。如在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。

1.2.3 死循环

某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是程序员故意设计的。

1.2.4 三者间的异同

1.3 死锁产生的必要条件

1.3.1 互斥条件

只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。

1.3.2 不剥夺条件

进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

1.3.3 请求和保持条件

进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。

1.3.4 循环等待条件 

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

注意:发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)。如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

1.4 什么时候会发生死锁

对不可剥夺资源的不合理分配,可能导致死锁:

  • 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU的竞争是不会引起死锁的。
  • 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
  • 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)。

1.5 死锁的处理策略

1.5.1 预防死锁

破坏死锁产生的四个必要条件中的一个或几个。

1.5.2 避免死锁

用某种方法防止系统进入不安全状态,从而避免死锁,如银行家算法。

1.5.3 死锁的检测和解除

允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。

二、死锁的处理策略

2.1 预防死锁

2.1.1 破坏互斥条件

2.1.1.1 互斥条件

只有对必须互斥使用的资源的争抢才会导致死锁。

2.1.1.2 策略缺点

并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件。

2.1.2 破坏不剥夺条件

2.1.2.1 不剥夺条件

进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

2.1.2.2 策略缺点

  • 实现起来比较复杂。
  • 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
  • 反复地申请和释放资源会增加系统开销,降低系统吞吐量。

2.1.3 破坏请求和保持条件

2.1.3.1 请求和保持条件

进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。

2.1.3.2 采取方法

可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

2.1.3.3 策略缺点

有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。

2.1.4 破坏循环等待条件

2.1.4.1 循环等待条件

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

2.1.5.2 采取策略

  • 可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。
  • 原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。

2.1.5.3 策略缺点

  • 不方便增加新的设备,因为可能需要重新分配所有的编号;
  • 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;
  • 必须按规定次序申请资源,用户编程麻烦。

2.2 避免死锁

2.2.1 安全序列、不安全状态、死锁的联系

  • 安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个
  • 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
  • 如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)。
  • 因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是银行家算法的核心思想。

2.2.2 安全性算法步骤

  • 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
  • 不断重复上述过程,看最终是否能让所有进程都加入安全序列。

2.2.3 银行家算法

2.2.3.1 背景知识

银行家算法是荷兰学者 Dijkstra 为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。

2.2.3.2 核心思想

在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

2.2.3.3 银行家算法步骤

  • 检查此次申请是否超过了之前声明的最大需求数
  • 检查此时系统剩余的可用资源是否还能满足这次请求
  • 试探着分配,更改各数据结构
  • 用安全性算法检查此次分配是否会导致系统进入不安全状态

2.3 检测和解除

2.3.1 死锁的检测

 

2.3.2 死锁的解除

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

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

相关文章

深入理解Java中的synchronized

文章目录 前言正文一、多线程操作同一数据时的问题二、问题分析三、synchronized 解决问题四、synchronized 是怎么解决问题的五、Java1.6时的优化5.1 自旋锁5.2 自适应锁5.3 锁消除5.4 锁粗化5.5 偏向锁(单线程高效场景)5.2 轻量级锁(多线程…

MySQL数据表查询

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:进入MySQL知识专…

IO、存储、文件系统的简单介绍

目录 一.什么是IO 第一类:存储器IO 第二类:设备IO 二.存储 三:文件系统 总结 一.什么是IO I(input):放入数据 O(output):取出数据 所以我们平时说的IO,实际上就是放入数据和存储数据的意思 在这里,我们一般将IO又分为两大类 第一类:存储器IO 这类IO主要针对的是计算机中…

2023年最新同步网盘排行榜,了解哪些平台适合您的文件同步需求!

在数码领域,同步盘是一个极其受欢迎的工具,它可以帮助人们在不同设备之间共享文件。作为同步盘用户,我们关心的一个很重要的问题就是,在同步盘市场上,哪些同步盘是最好的? 今天我们综合了不同的产品测评网站…

Vulnhub: Corrosion:2靶机

kali:192.168.111.111 靶机:192.168.111.131 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.131 通过nmap脚本枚举出8080端口存在backup.zip文件,下载后解压发现需要密码,利用john爆破压缩包密…

【SSM项目整合流程】

目录 一.用Maven创建一个project项目 1.1新建一个项目,选择Maven然后点击下一步 1.2设置项目名称和AGV后点击完成 1.3在pom.xml文件中导入依赖和配置打包方式 二.添加web工程 2.1在Project Structure中型添加一个web工程 2.2配置web.xml 三.创建SpringMVC的…

2.设置Salesforce开发环境

文章目录 前言1. 关于Salesforce DX环境2. 配置Visual Studio Code2.1 安装CLI2.2 设置Visual Studio Code 3. 创建一个Hello World Lightning web component 来检证开发环境3.1 创建一个Salesforce DX project3.2 将deploy好的组件加到lightning App中 前言 此处解释关于本文…

数据结构——C语言实现常见排序(插入排序、希尔排序、选择排序、堆排序、冒泡排序)

引言: 现在是北京时间2023年6月23日13点19分,度过了一个非常愉快的端午节。由于刚从学校回家,一下子伙食强度直升了个两三个档次。这也导致我的肠胃不堪重负,我也准备等会去健身房消耗一下盈余的热量。回到家陪伴爷爷走人生最后的…

C++11 线程库—线程操作(更新中)

前言 在C11推出线程库前,Windows和Linux操作系统的线程操作并不同,这就导致多线程程序无法跨平台,如果想要跨平台,会很麻烦并且容易出错。C11推出的线程库就解决了这一问题。 因为在Windows和Linux操作系统中有一些独特的常量&am…

OpenGL 鼠标拾取模型

1.简介 在我们的场景中,使用鼠标光标点击或“挑选”一个3d对象是很有用的。一种方法是从鼠标投射3d光线,通过相机,进入场景,然后检查光线是否与任何物体相交。这通常被称为光线投射。 我们不是从局部空间中的网格开始&#xff0c…

gRPC 实践

RPC 包管理,1.12前;旧版本要设置GO111MODULEoff;查找gopath/src;goroot/src;几乎没有包管理; 新版本;go.mod; module xxx go version设置GO111MODULEon 是什么 远程过程调用; …

Windows页面置换算法与文件操作

实验一 一、实验内容或题目: 随机产生页面访问序列,并实现LRU, FIFO, OPT三种算法进行缺页比较 二、实验目的与要求: 1、编写程序,随机产生页面访问序列,并实现LRU, FIFO, OPT三种算法进行缺页比较。 2、理解三种算…

自监督学习简介

1.  自监督学习 自监督学习是可以看做是一种特殊的无监督学习的一个子类别(但并非无监督学习),因为它利用了未标记的数据。 关键思想是让模型无需手动标签即可学习数据表示。一旦模型学会了如何表示数据,那么它就可以用较少量的…

liunx+docker+rabbitmq安装延迟队列插件

安装版本 rabbit: RabbitMQ 3.8.16 erlang: Erlang 23.3.2 rabbit: rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez 准备 1.rabbmitMQ 安装 docker pull rabbitmq 2.rabbmitMQ 启动 docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER用户…

10 种分布式系统必备模式

在当今的技术领域中,分布式系统已成为许多大型应用程序和平台的核心。构建高性能、可伸缩和可靠的分布式系统是一个复杂的挑战,需要合理的架构设计和模式选择。本文将介绍10个必备的分布式系统模式,帮助您更好地理解和应用这些模式以提升系统…

pytorch笔记:RNN 系列

来自B站视频,API查阅,TORCH.NN RNN可以处理变长序列,是因为其每个时刻的参数是共享的RNN每算出一个时刻都可以输出,适合流式输出,但串行计算比较慢,无法获取太长的历史信息RNN 初始隐状态不提供默认是0&am…

一、枚举类型——用枚举实现状态机

枚举类型很适合用来实现状态机。状态机可以处于有限数量的特定状态。它们通常根据输入,从一个状态移动到下一个状态,但同时也会存在瞬态。当任务执行完毕后,状态机会立即跳出所有状态。 每个状态都有某些可接受的输入,不同的输入…

你应该知道的 Python 自动化脚本

概要 我们都有一些需要重复做的任务。幸运的是,我们可以将其中一些过程自动化,这样我们就可以专注于做其他真正需要精力和注意力的事情。 在这篇文章中,我们将谈论一些 Python 自动化脚本,你可以轻松地用它们来执行自动化任务。重…

巨星内马尔为孕期出轨道歉了!喊话女友:“我不能想象失去你”

近日,巴西球星内马尔在女友布鲁娜孕期出轨的传闻引起了社会广泛关注。 22日凌晨,内马尔在自己的社交媒体上发文回应并道歉,表示自己在球场内外都会犯错,但私生活的问题他会在家里解决。 他还重申了自己已经为犯下的错误和不必要的…

python爬虫_函数的使用

文章目录 ⭐前言⭐python函数💖 参数传递—值💖 参数传递—引用💖 多参数(*)💖lambda匿名函数 结束 ⭐前言 大家好,我是yma16,本文分享关于python函数入门使用。 该系列文章: python爬虫_基本数…