课时6—死锁(二)

news2025/1/17 22:01:45

一、死锁的避免

避免死锁同样属于事先预防策略,是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。

1、系统安全状态

在避免死锁方法中,把系统的状态分为安全状态和不安全状态。当系统处于安全状态时可避免发生死锁,而当系统处于不安全状态时,则可能会进入死锁状态

2、安全序列

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。

3、由安全状态进入不安全状态

如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,可能会发生死锁。(不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。

那么问题来了,什么是银行家算法呢?

先举个例子,便于理解:
此时你是一位成功的银行家,手里有100亿资金…

此时有三个企业想找你贷款,分别是企业B,企业A,企业T

B:“大哥,我最多要借70亿”

A:“大哥,我最多要借40亿”

T:“大哥,我最多要借50亿”

有个规矩:借给企业的钱达不到企业提出的最大要求,那么你借的钱就打水漂了

当然你也不想你的钱打水漂,那么就要考虑 怎么借才能保证自己的100亿不打水漂

最大要求已经借走最多再借
B702050
A401030
T503020

此时你手里还有40亿…
分析借钱的安全序列
此时B想跟你借30亿,你敢借吗?

假如你答应了:借给了B 30亿,那么你的手里还有10亿,上面的图稍作修改,如下图:

最大要求已经借走最多再借
B7020+30=5050-30=20
A401030
T503020

如果其他企业再提出借20亿,那你巴比Q了,显然你借不了,你的钱打水漂了,所以这个钱不能借。不安全

此时A想跟你借20亿,你敢借吗?
假如你答应了:借给了A 20亿,那么你的手里还有20亿,上面的图稍作修改,如下图:

最大要求已经借走最多再借
B702050
A4010+20=3030-20=10
T503020

接下来你可以把这20亿都借给T企业。等他把钱全部还回来了,手里就有50亿,再把这些钱借给B企业。等他把钱全部还回来了,手里就有70亿,最后再借给A企业。这样你的钱就全回来了。

所以此借钱序列(安全序列):T->B->A
根据上述思路自行验证这个序列:A->T->B

4、银行家算法

银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。
***核心思想:***在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
1)数据结构:
①可利用资源向量Available。长度为m的一维数组,Available表示还有多
少可用资源。
②最大需求矩阵Max。表示各进程对资源的最大需求数,nxm矩阵。
③分配矩阵Allocation 。表示已经给各进程分配了多少资源,n x m矩阵
④需求矩阵Need。矩阵表示各进程最多还需要多少资源,
Max -Allocation=Need
⑤进程P的请求向量。用长度为m的一位数组,表示进程此次申请的各种资源数。

2)算法步骤:
设Request是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
①如果Requesti[j]≤Need[i,j]门便转向步骤②;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
②如果Requesti[j]≤Available[j],便转向步骤③;否则,表示尚无足够资源Pi 须等待。
③系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值
Available[j]=Available[j]-Requesti[j];
Allocation[i,j]=Allocation[i,j]+Requesti[j];
Need[i.j]=Need[i,j]-Requesti[j];
④系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作
废,恢复原来的资源分配状态,让进程Pi等待。

3)安全性算法:
系统所执行的安全性算法可描述如下:
①设置两个向量:
a.工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素 在执行安全算法开始时,Work=Available;
b.Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够资源分配给进程时,再令Finish[i]=true。
②从进程集合中找到一个能满足下述条件的进程
a.Finish[i]=false;
b. Need[i,j]≤Work[j];
若找到,执行步骤③,否则,执行步骤④。
③当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[j]+Allocation[i,j];
Finish[i]=true;
返回步骤②。
④如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
4)安全算法举例
算法:银行家算法(做题过程)

问题:
在这里插入图片描述
解析:
假设0,6,2,如下不安全:
在这里插入图片描述
假设1,1,1,如下不安全:
在这里插入图片描述
假设0,4,7,如下不安全:
在这里插入图片描述
假设1,4,0,如下安全:
在这里插入图片描述

二、死锁的检测与解除

如果系统中既不采用预防死锁也不采用避免死锁的措施,系统就很有可能发生死锁。这种情况下,系统应当提供两个算法:
1)死锁检测算法:用于检测系统状态,已确定系统中是否发生了死锁。
为了能对死锁进行检测,在系统中必须:
①用某种数据结构来保存资源的请求和分配信息。
②提供一种算法,利用上述信息来检测系统是否进入死锁状态。
资源分配图
两种结点:进程结点和资源结点(资源结点可能有多个)
两种边:
进程结点->资源结点:代表一个进程结点请求一类资源。
资源结点->进程结点:代表这类资源已经分配给了指向的进程结点。
死锁定理:如果某时刻系统的资源分配图是不可简化的,那么此时系统死锁。
在这里插入图片描述
2)死锁解除算法:当使用这种算法的时候该算法可将系统从死锁中解脱出来。一旦检测出死锁的发生就应该立即解除死锁。
补充:并不是系统中所有的进程都是死锁状态,用死锁检测算法分配图后,还连着边的进程就是死锁进程。
解除死锁的主要方法:
①资源剥夺法。
将某些死锁进程锁占有的资源剥夺并分配给其他进程。但是应该防止被挂起的进程长时间得不到资源饿死。
②撤销进程法。强制撤销部分死锁进程或者全部死锁进程,简单粗暴但是付出的代价较大。
③进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这个就要求记录进程的历史消息,设置还原点。

还有一类题:
在这里插入图片描述
俺的理解:就是不能让两个一起运行,运行一个一个来,不然生成的东西别的地方用的话不知道,用哪个都会导致死锁。
再练一个吧!!!

例:某系统中有三个并发进程都需要四个同类资源,则该系统必然不会发生死锁的最少资源是(B)
A.9 B.10 C.11 D.12
在这里插入图片描述

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

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

相关文章

Android UI开发之多样式富文本的简洁实现

多样式富文本的简洁实现 原文链接:Android UI开发之多样式富文本的简洁实现 AppendableStyleString 允许你快速构建多种样式文字。 特性 支持对于同一个字符串设置多种样式。支持文字和图片。提供默认样式。采用 DSL 确保更清晰的样式作用范围 快速开始 下面的…

【事务失效】十种常见场景

前提 大多数Spring Boot项目只需要在方法上标记Transactional注解,即可一键开启方法的事务性配置。 但是,事务如果没有被正确出,很有可能会导致事务的失效,避免因为事务处理不当导致业务逻辑产生大量偶发性BUG 事务的传播类型 …

JDK8-17的特性发生了哪些变化

JDK8-17的特性发生了哪些变化 垃圾回收器Java交互式编程接口定义扩展String底层结构变更of 创建不可变序列HTTP 2 协议接口引入 var 关键字字符串增强lambda 表达式类型推导switch 增强支持文本块定义instanceof 模式匹配引入record 关键字新增密封类的定义switch二度加强模块…

栈及其实现

目录 一&#xff1a;栈 1.栈的概念和结构 2.栈的实现 <1>.初始化栈 <2>.入栈 <3>.出栈 <4>:获取栈顶元素 <5>.获取栈中有效元素个数 <6>.销毁栈 <7>.示例 二&#xff1a;栈的完整代码 一&#xff1a;栈 1.栈的概念和结构 …

Origin中log2的计算,设置以2为底的log坐标

使用高中的换底公式即可&#xff0c;把2的底换成10的底计算 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5747fdbd2b5c43f095d716092fd17124.png

模式介绍和基本管理

模式介绍&#xff1a; 用户的模式(SCHEMA&#xff09;指的是用户账号拥有的对象集&#xff0c;在概念上可将其看作是包含表、 视图、索引和权限定义的对象。在 DM 中&#xff0c;一个用户可以创建多个模式&#xff0c;一个模式中的对象 &#xff08;表、视图等&#xff09;可以…

【深度学习】- 作业2: MNIST手写数字识别

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

stata软件基本操作

一、stata软件介绍 Stata是一个用于分析和管理数据的功能强大又小巧玲珑的实用统计分析软件&#xff0c;由美国计算机资源中心&#xff08;Computer Resource Center&#xff09;研制。它同时具有数据管理软件、统计分析软件、绘图软件、矩阵计算软件和程序语言的特点&#xf…

二叉树的相关知识

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#…

Typora Mac版本安装 Pandoc 导出文件为word格式(windows可通用)

今天在和一位商务小伙伴对接的时候&#xff0c;需要提供一份 word 版本的初稿。对于习惯了使用 支持 markdown 语法的 typora 来说&#xff0c;复制粘贴到 word 是不可能的。 可以通过 “导出” 功能&#xff0c;选择将当前文件导出为 “word” 格式&#xff0c;这个过程有个小…

通过CSS实现炫酷效果,让你的网页不再平淡无奇

通过CSS实现炫酷效果&#xff0c;让你的网页不再平淡无奇 (一)CSS基础1.1CSS介绍1.2CSS样式1.3CSS 格式 &#xff08;二&#xff09;CSS 选择器2.1标签选择器2.2类选择器2.3层级选择器2.4id选择器2.5组选择器2.6伪类选择器2.7通配符选择器 &#xff08;三&#xff09;样式表引入…

【自然语言处理】 - 作业3: 文本情感分析

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

C++的继承

继承 1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员7.复杂的菱形继承及菱形虚拟继承 1.继承的概念及…

舒适交友 - 什么样的婚姻最舒服 稳态婚姻

人人都是心理学家,mbti等_个人渣记录仅为自己搜索用的博客-CSDN博客 人生两大目标: 生产力提升 让身边的人快乐. 激动 兴奋 不一定 舒适 开心 幸福 安全感 平静 宁静 祥和 婚姻 稳态 041 探秘“情绪”——如何确定只有六种基本情绪&#xff1f; - 知乎 ( 6种原始情绪&am…

chatgpt赋能Python-python_dilate

Python中的dilate操作&#xff1a;了解该操作及其应用 在计算机视觉领域&#xff0c;dilate操作是一种常用的图像处理技术。在Python中&#xff0c;我们可以使用OpenCV库来实现dilate操作。本文将介绍dilate操作的基本概念&#xff0c;讨论其应用及如何使用Python进行实现。 …

C++爱好者的自我修养(13.1):一维数组——简介,声明,初始化(赋值)

文章目录 1.什么是数组&#xff1f;2.数组的声明2.1格式2.2特别注意&#xff1a;有效下标值的重要性 3.数组的初始化&#xff08;赋值&#xff09;3.1格式3.2 C11新增的初始化方法规则功能3.2.1 等号的省略3.2.2 当大括号内无东西3.2.3 禁止缩窄转换 1.什么是数组&#xff1f; …

Kafka实时数据同步

目录 1 概述 2 捕获Oracle数据到Kafka 2.1 数据捕获设置 2.2 数据发布任务设置 2.3 捕获到发布数据流映射 2.4 查看任务执行日志 3 订阅Kafka数据到ClickHouse 3.1 数据订阅设置 3.2 数据加载设置 3.3 订阅到加载数据流映射 3.4 查看任务执行日志 4 校验数据一致性 …

GEE:GEDI数据提取值到矢量区域和点

作者:CSDN @ _养乐多_ 本文将介绍GEDI数据集从GEE上下载到本地,并将每一个激光点的值提取为一个矢量区域,并提取值到矢量区域的方法。 文章目录 一、GEDI数据下载二、GEDI数据栅格矢量化三、提取值到区域四、提取栅格值到点五、空间插值一、GEDI数据下载 GEDI数据下载链接:…

80个Python练手小项目;AI开发者的总结与反思;B站免费Stable Diffusion视频教程;五问ChatGPT+医学影像 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『美团大模型已秘密研发数月』在仅剩一年的窗口期里努力奔跑 5月18日下午&#xff0c;美团内部召开大模型技术分享会&#xff0c;美团…

【深度学习】- 作业5: Didi交通场景-车辆预测

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…