操作系统——死锁

news2024/10/7 19:30:06

0.关注博主有更多知识

操作系统入门知识合集

目录

5.1死锁概念

5.2死锁的起因

5.3预防死锁的策略

思考题:

5.1死锁概念

在介绍死锁之前,先来探究一个问题:哲学家就餐问题。五个哲学家围坐在圆桌边,有5支筷子,哲学家在思考、休息、吃饭这三个动作上循环。

我们制定以下规则:

  1.吃饭时使用两支筷子

  2.每次只能取到一支筷子

  3.只取身边的筷子(无论是左还是右)

  4.吃完放下筷子

那么我们可以用文字来模拟以下每个哲学家的行为:

那么我们明显可以看到哲学家就餐问题当中的互斥和同步关系。我们可以给筷子编号,让N号哲学家可以取一支N号筷子(左手边筷子)和一支[(N+4)%5]号筷子(右手边筷子):

我么再以代码的角度去理解这个问题是如何运转的:

现在有趣的现象发生了:这五个哲学家并发执行,也就是说他们可以在同一时刻拿到左手边的筷子。此时每个哲学家都在等待自己右手边的哲学家放下他左手边的筷子,但因为每个哲学家都在这样等,每个哲学家又都不放下自己左手边的筷子,所以这五个哲学家一起阻塞在取右手边筷子,导致谁吃不了饭。这种情况,我们称为发生死锁

这就好比小明同学在外面玩,他妈妈在家里。此时快到饭点了,小明说妈妈做饭了他就回家,妈妈说小明回来了她再做饭。这就导致小明永远回不了家,妈妈永远做不了饭。

死锁的定义:两个或多个执行流无限期地等待永远不会发生的条件,其结果就是导致每个执行流永远阻塞。回到哲学家就餐的话题,每个哲学家都在无限期地等待邻座放下筷子,而邻座没吃完饭之前不会放下筷子,而每个哲学又都只有一支筷子而一直不吃饭,这就是一种死锁状态。

死锁的另一种定义(通常是书籍上写的):在两个或多个执行流中,每个执行流都持有某种资源,但又继续申请其他执行流已经持有的某种资源。此时每个执行流都拥有其运行所需条件的一部分资源,但是又都不够,从而每个执行流都不能向后执行,都陷入阻塞状态。这种状态称为死锁。

5.2死锁的起因

死锁的起因:

  1.系统资源有限:当资源数目不足时,执行流对资源的竞争而可能产生死锁(上面的哲学家就餐问题)

  2.并发执行流的推进顺序不当:执行流请求资源和释放资源的顺序不当时,可能引发死锁(并发执行是不可预见的,这里就不谈了)

  3.不正确的P-V操作也可能会带来死锁

我们把视角切到生产者消费者问题:

关于死锁的一些结论:

  1.导致死锁的执行流至少是两个

  2.导致死锁的执行流至少有两个已经占有资源(只差一部分资源即可向后执行)

  3.导致死锁的执行流都在等待资源

  4.导致死锁的执行流可以是当前系统中所有执行流的子集(假设有8个执行流,导致死锁的执行流可以是2个、3个、4个...8个)

5.3预防死锁的策略

死锁的必要条件:

  1.互斥条件:执行流之间互斥使用资源

  2.不剥夺条件:执行流在自己释放资源之前,其他执行流不能强行剥夺当前执行流占有的资源

  3.部分分配条件:执行流边运行边申请资源,临时需要临时分配。区别于全部分配,全部分配不可能导致死锁(例如哲学家吃饭问题,一开始只要让一个哲学家或两个哲学家先吃饭,就不可能导致死锁)

  4.环路条件:多个执行流构成环路,环路中的每个执行流占用的资源被前一个执行流申请,而自己需要的另一部分资源被下一个执行流占用

只有这四个条件同时成立,才会导致死锁。也就是说,只要破坏四个条件中的一个,就不可能导致死锁。例如哲学家就餐问题,我们只需要限定最多4人同时吃饭,也就相当于破坏环路条件了(因为必定有一人不需要等待邻座的筷子)。

解决死锁的策略:

  1.预防死锁:通过设置某些限制条件,破坏死锁四个必要条件中的任意一个,就可以防止死锁。但是能,要破坏互斥条件,难;破坏不剥夺条件,代价大;破坏部分分配条件,需要使用预先静态分配(这就会导致给每个执行流百分之百的资源,但执行流可能只使用其中百分之一);破坏环路条件,可以使用有序资源分配。预防死锁的策略较易实现,在早期被广泛使用。它被淘汰的原因在于限制太过严格,导致资源利用率和吞吐量降低。

  2.避免死锁:不事先采用限制去破坏死锁的必要条件,而是在资源分配过程中,用某种算法去评估分配的资源会不会让系统(多个执行流之间)进入死锁状态,如果死锁,就不分配此次资源,从而避免死锁的发生。典型的算法就是银行家算法,同时它是一个很难的算法。避免死锁的策略虽然只需要较弱的限制条件,并且可以获得较高的资源利用率和吞吐量,但是缺点显而易见,要实现太困难了。

  3.检测死锁和恢复死锁:允许死锁发生,但可以通过检测机制及时检测出死锁状态,并精确确定与死锁有关的执行流和资源,然后采取适当措施,将已发生的死锁清楚,让执行流"解放"。缺点:检测方法复杂,难度高;恢复死锁的方法依靠人工,即使检测到死锁的发生,也需要人工去撤销一些执行流然后再重新分配资源。

预先静态分配:

  1.特点:

    1)执行可能被延迟:所需资源不能全部满足时(预先分配的资源万一不够)

    2)应用开销增大:运行前要估算资源的需求

    3)资源利用率低:资源被占而不用(给某一执行流分配百分之百的资源,但它只占用百分之一)

  2.改进:资源分配的单位由执行流改为程序步

有序资源分配:

  1.目的:破坏环路条件,使得环路无法构成

  2.策略:系统(多个执行流)中的每个资源分配有唯一的序号,执行流每次申请资源时只能申请序号更大的资源。如果执行流已经占有资源的序号为M,那么下一次只能申请序号大于M的资源,而不能申请序号小于或等于M的资源。

  3.资源分配策略:分配资源时检查资源序号是否符合递增规定。若不符合,则拒绝申请,并将申请资源的执行流撤销;若符合且资源可用,那么便予以分配;若符合但资源不可用,当前申请资源的执行流陷入阻塞。

Windows和Linux采用的死锁解决方案非常有意思,我们把它称为鸵鸟策略——我知道有死锁,但我选择无视。

思考题:

1.在Linux或Windows的实际应用中,用户常说的“死机”或“宕机”或“程序卡住”或“系统卡住,键鼠没有任何响应”与本章的“死锁”是同一问题吗?

不是。程序自己崩溃是单一的,不符合死锁的条件。

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

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

相关文章

免费的绘图工具DrowIO下载及安装

还在为论文绘图而烦恼吗?还在为如何选择画图工具而烦恼吗?没事,本期就给你们推荐一款超级好用且免费的绘图工具——DrawIO。 目前使用比较多的绘图工具有:Visio、亿图图示、Word、PPT、DrawIO等 其中DrawIO由于其既实用又免费的…

使用 Esp32 和 TinyML 进行手势分类

介绍 手势分类是机器学习可以做什么的一个简单但同时又很好的例子。它使用大量“混乱”的数据来对事物进行分类。 在这个项目中,我们将制作一个包含 4 个类的分类器,idle、up_down、left_right 和 circle。 数据采集 要将数据上传到 Edge Impulse,我们需要使用 Edge Imp…

199. 二叉树的右视图【111】

难度等级:中等 上一篇算法: 236. 二叉树的最近公共祖先【190】 力扣此题地址: 199. 二叉树的右视图 - 力扣(Leetcode) 1.题目:199. 二叉树的右视图 给定一个二叉树的 根节点 root,想象自己站在…

JavaScript事件

事件流描述的是从页面接收事件的顺序。比如说单击了某个按钮&#xff0c;但是单击事件不仅发生在按钮上&#xff0c;在单击按钮的同时&#xff0c;也单击了按钮的容器元素&#xff0c;甚至是 <body> 、<html> 、document。 事件传播的顺序不同导致存在两种事件流机…

初识CPU(二)

目录 一、控制器的功能与工作原理 1.控制器的设计思路 2.控制器的分类 3.微程序 3.1微命令 3.2微操作 3.3微指令 3.4微程序 3.5微地址 4.控制方式 4.1同步控制方式 4.2异步控制方式 4.3联合控制方式 4.4人工控制方式 二、微指令 5.微指令的编码方式 5.1直接编码…

基于springboot的家政服务管理平台(源码,设计文档等)

摘要 随着家政服务行业的不断发展&#xff0c;家政服务在现实生活中的使用和普及&#xff0c;家政服务行业成为近年内出现的一个新行业&#xff0c;并且能够成为大众广为认可和接受的行为和选择。设计家政服务管理平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;…

kafka的安装与使用

文章目录 kafka安装1 上传安装包2 解压安装包3 创建logs文件夹4 修改配置文件5 分发kafka6 启动kafka kafka使用1 启动kafka2 关闭kafka3 查看topic4 创建topic,名称为test5 删除名称为test的topic6 向topic发送数据7 从topic里消费数据 kafka安装 kafka安装前需要确认zookeep…

《程序员面试金典(第6版)面试题 16.09. 运算

题目描述 请实现整数数字的乘法、减法和除法运算&#xff0c;运算结果均为整数数字&#xff0c;程序中只允许使用加法运算符和逻辑运算符&#xff0c;允许程序中出现正负常数&#xff0c;不允许使用位运算。 你的实现应该支持如下操作&#xff1a; Operations() 构造函数minus…

Linux【模拟实现C语言文件流】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、FILE 结构设计2、函数使用及分析3、文件打开 fopen4、文件关闭 fclose5、缓…

4.3 实施部署Nginx 高可用负载均衡集群

部署大致可分为&#xff1a;准备工作、配置、验证与交付几个步骤&#xff0c;接下来按顺序逐一介绍。 4.3.1 准备工作 Nginx高可以负载均衡集群准备工作分两个层面&#xff1a;前端负载均衡器的准备工作与后端真实服务器的准备工作。根据长期实践出来的经验&#xff0c;先准备后…

更轻更好用的蓝牙耳机,日常佩戴更舒适,QCY Crossky Link体验

平时为了方便接打电话&#xff0c;我经常会戴上一副蓝牙耳机&#xff0c;不过戴久了入耳式的耳机&#xff0c;总感觉不舒服&#xff0c;上个月我看到一款设计很新颖的开放式耳机&#xff0c;来自我之前用过的一个国产品牌&#xff0c;最近到手后试了试&#xff0c;感觉质量不错…

Pandoc 从入门到精通,你也可以学会这一个文本转换利器

Pandoc 简介 如果你需要在不同的文件格式之间相互转换&#xff0c;多半听说或使用过文档转换的瑞士军刀——Pandoc。事实上&#xff0c;不仅人类知道 Pandoc&#xff0c;最近很火的人工智能 ChatGPT 也知道「将 Markdown 转换为 docx」&#xff0c;首选方案是使用 Pandoc。 ​…

Codeforces Round 868 (Div. 2)

Problem - D - Codeforces 思路&#xff1a; 首先&#xff0c;一个位置至多贡献1&#xff0c;不然就是0.如[l1,r]与[l2,r]都是回文串&#xff08;l1<l2) 若(l1r)/2<l2,即[l2,r]本身就是[l1,r]回文串右边的一部分&#xff0c;那么他的贡献在[l1,r]左边已经计算过。如果(…

Python程序的执行过程

哈喽&#xff0c;大家好&#xff0c;五一快乐呀&#xff0c;都去哪里旅游了呢&#xff1f;再游玩之余也花点时间来学习学习&#xff0c;让自己更强哟。这期就给大家分享的是Python程序执行的过程学习。 之前已经给大家介绍了Python语言的简介、Python环境的安装、IDE的选择与安…

4 斐波那契数列

4 斐波那契数列 作者: Turbo时间限制: 1S章节: 递归 问题描述 : 斐波那契数列的排列是&#xff1a;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89&#xff0c;…

CTF-PHP反序列化漏洞2-利用魔法函数

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

.net 智慧手术麻醉管理系统 WCF框架

实用性&#xff1a; 充分考虑科室业务场景实用性&#xff0c;把满足临床需要为第一要素进行考虑。具有操作简单、提示清晰、逻辑性强&#xff0c;直观简洁等特点。 灵活可自定义&#xff1a; 软件设计采用模块式、组件式开发&#xff0c;根据临床需要可根据实际业务进行组合…

【MATLAB第26期】区间预测 | 基于MATLAB的LASSO分位数回归预测模型 负荷预测数据

【MATLAB第26期】区间预测 | 基于MATLAB的LASSO分位数回归预测模型 负荷预测数据 一、效果预览 MSE: 22.9684327801807 %15分钟 21.6725387054707%30分钟 24.0995456594418%45分钟 21.3992361173462%60分钟 二、数据选择 案例数据&#xff1a;两个月负荷数据3599*30&#x…

网络编程 总结三

一、并发服务器模型 【1】 循环服务器 1>一次只能处理一个客户端的请求&#xff0c;等待这个客户端退出后&#xff0c;才能处理下一个客户端 2>缺点&#xff1a;循环服务器所处理的客户端不能有耗时操作 //*****模型****** sfd socket(); bind(); listen(); while(1)…

springboot websocket通信

目录 一、websocket是什么 二、实现websocket 2.1参考学习b站资料&#xff08;一定要看&#xff0c;前后端详细&#xff09; 2.2学习配套代码 一、websocket是什么 WebSocket_ohana&#xff01;的博客-CSDN博客 二、实现websocket 2.1参考学习b站资料&#xff08;一定要看…