死锁-第三十四天

目录

什么是死锁

进程死锁、饥饿、死循环的区别

死锁产生的必要条件

什么时候会发生死锁

死锁的处理策略

本节思维导图


什么是死锁

每一个人都占有一个资源,同时又在等待另一个人手里的资源

进程死锁、饥饿、死循环的区别

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

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

死循环:某进程执行过程中一直跳不出某个循环的现象(程序逻辑bug造成或程序员故意设计的)

共同点区别
死锁都是进程无法顺利向前推进的现象(故意设计的死循环除外)死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁,此外,发生死锁的进程一定处于阻塞态
饥饿可能只有一个进程发生饥饿。发生饥饿的进程即可能是阻塞态(如长期得不到需要的IO设备),也可能是就绪态(长期得不到处理机)
死循环可能只有一个进程发生死循环,死循环的进程可以上处理机运行(可以是运行态)只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的,死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题

死锁产生的必要条件

产生死锁必须同时满足以下四个条件:

  1. 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备而像内存、扬声器这样可以童话故事多个进程使用的资源是不会导致死锁的,因为进程不会阻塞等待这种资源)
  2. 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放
  3. 请求和保持条件:进程已经持有了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放
  4. 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求(当每一个哲学家都拿起了他们的左筷子后就会等待下一个哲学家放下自己的左筷子从而达到自己能拿起两支筷子的目的)

注意事项:

1、发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件,如果此时有一个神秘人可以为某一个哲学家提供筷子那么,该哲学家除了可以等待下一个哲学家放下筷子也可以等待该神秘人为自己提供筷子,从而达到自己能拿起两支筷子的目的)

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

什么时候会发生死锁

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

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

死锁的处理策略

  1. 预防死锁:破坏死锁产生的四个必要条件中的一个或几个
  2. 避免死锁:用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
  3. 死锁的检测和解除:允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采用某种措施解除死锁

本节思维导图

~over~

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

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

相关文章

drf序列化与序列化器的使用

序列化类的使用 使用序列化类实现五个接口功能,但是我们发现并没有做数据校验,也没有做反序列化,是我们自己手动去进反序列化,是我们自己使用for来进行拼接的,很不方便,我们可以使用一个drf自带的名叫序列…

ASP.Net实现海鲜添加(三层架构,异常处理)

演示功能: 点击启动生成页面 点击添加跳转新界面 此处设置文本框多行 点击Button添加 步骤: 1、建文件 下图是三层架构列表,Models里面有模拟数据库中列的类,DAL中有DBHelper和service,BLL中有BllManager文件用于ui界面直接调用…

SpringBoot之多环境开发配置

1 多环境开发配置 问题导入 在实际开发中,项目的开发环境、测试环境、生产环境的配置信息是否会一致?如何快速切换? 1.1 多环境启动配置 yaml文件多环境启动 不同环境使用—隔开 示例代码: spring:profiles:active: dev#生产…

易天推出10G SFP+ 可调 DWDM光模块:网络通信新升级

随着网络技术的飞速发展,为了满足用户对高速数据传输日益增长的需求。易天研发团队在原来的基础上推出了全新升级的10G SFP 可调 DWDM光模块,本文将详细介绍这款新升级光模块的特点、优势以及应用场景。 易天光通信10G SFP 可调 DWDM光模块具有出色的波…

三、C#面向对象编程(继承与多态)

在C#中,面向对象编程(OOP)是编程的基本范式,它使用类和对象的概念来构建软件应用程序。面向对象编程的三个主要特性是封装、继承和多态。 封装:封装是将数据(属性)和操作数据的函数(…

大数据学习(31)-Spark非常用及重要特性

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

项目中接入神策埋点

项目中接入神策埋点(免费),react和vue通用 1、下包 使用npm 或 yarn 或 pnpm 安装依赖 npm install --save sa-sdk-javascript 2、初始化准备: 定义环境变量 VITE_PROJECT_ENV (prod demo test) 3、初始化神策 在 utils 文…

QT基础知识

QT基础知识 文章目录 QT基础知识1、QT是什么2、Qt的发展史3、为什么学习QT4、怎么学习QT1、工程的创建(环境的下载与安装请百度)2、创建的工程结构说明3、怎么看帮助文档1、类使用的相关介绍2. 查看所用部件(类)的相应成员函数(功…

为什么说 $mash 是 Solana 上最正统的铭文通证?

早在 2023 年的 11 月,包括 Solana、Avalanche、Polygon、Arbitrum、zkSync 等生态正在承接比特币铭文生态外溢的价值。当然,因铭文赛道过于火爆,当 Avalanche、BNB Chain 以及 Polygon 等链上 Gas 飙升至极值,Arbitrum、zkSync 等…

多任务并行处理相关面试题

我自己面试时被问过两次多任务并行相关的问题: 假设现在有10个任务,要求同时处理,并且必须所有任务全部完成才返回结果 这个面试题的难点是: 既然要同时处理,那么肯定要用多线程。怎么设计多线程同时处理任务呢&…

.babky勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 网络安全威胁不断进化,其中.babky勒索病毒引起了广泛关注。这篇文章91数据恢复将深入介绍.babky的狡猾特征,以及在遭受其袭击时如何高效地恢复被加密的数据,并提供实用的预防方法。当面对被勒索病毒攻击导致的数据文件加密…

基于Java课程作业管理系统

基于Java课程作业管理系统 功能需求 1、作业发布:系统需要支持教师发布作业,包括作业题目、要求、截止日期等信息。 2、作业提交:学生可以通过系统提交作业,系统需要支持多种文件格式的上传,并能够自动保存提交记录…

vue-vuex持久化处理

在src/utils文件夹下,创建storage.js文件 // 约定一个通用的键名 const INFO_KEY hm_shopping_info// 获取个人信息 export const getInfo () > {const defaultObj { token: , userId: }const result localStorage.getItem(INFO_KEY)return result ? JSON…

proteus元器件搜索

proteus元器件搜索 常用元器件类 电阻:Resistor 可变电阻:Variable Resistor 电位器 :potentiometer 三极管:在Transistors里查找,可以用指定的型号搜索,比如2N3904。也可使用npn和pnp查找。 二极管&…

Linux 网络系统管理 技能大赛 DNS赛题配置

主DNS服务部署 yum -y install bind bind-chroot bind-utils systemctl start named //开启named systemctl enable named //开机自启动 ss -tnl |grep 53 //查看端口是否正常启动 vim /etc/named.conf //编辑全局配置文件listen-on port 53 {any;}; //监听所有…

java多线程及线程锁

概述 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程(process):程序的一次执行过程,或是正在内存中运行的应用程序…

什么是自动化测试?为啥要学自动化测试?

什么是自动化测试,接着对常用的自动化测试框架进行了对比分析,最后,介绍了如果将自动化测试框架Cypress运用在项目中。 一、自动化测试概述 为了保障软件质量,并减少重复性的测试工作,自动化测试已经被广泛运用。在开…

C++ 字符串操作说明 续

一、strstr函数 extern char *strstr(char *str1, const char *str2); 1. strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。 2. str1: 被查找目标 string …

【LLM】大型语言模型综述论文

今天我将与大家分享一篇精彩的论文。这项调查提供了LLM文献的最新综述,这对研究人员和工程师来说都是一个有用的资源。 为什么选择LLM? 当参数尺度超过一定水平时,这些扩展的语言模型不仅实现了显著的性能改进,而且还表现出一些…

一文掌握 Golang 中的类型断言

目录 什么是类型断言 类型断言的基本语法 类型断言示例 类型断言原理 类型断言的使用场景 深入理解类型断言 类型断言的最佳实践 小结 类型断言是 Golang 中的一个非常重要的特性,使用类型断言可以判断一个接口的实际类型是否是预期的类型,以便进…