| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【操作系统⑩】——进程死锁【??银行家算法+详细样例?? 进程死锁的预防机制、避免机制、检测与解决】 -> 正文阅读 |
|
[数据结构与算法]【操作系统⑩】——进程死锁【??银行家算法+详细样例?? 进程死锁的预防机制、避免机制、检测与解决】 |
?? 重点篇 文章目录Banker’s algorithm 🏦 上一篇文章地址链接: 【操作系统⑨】——进程间通信的概述【kill() signal() shmget() shmat() 实例 共享存储通信 消息通信 管道通信 】. 一、进程死锁的概念与条件1.1 死锁定义??● 背景:多道进程的并发执行可以改善系统的资源利用率,但也可能出现——“进程相互等待对方释放资源才能继续运行”的情况。 ??● 死锁:系统中多个进程无限期地等待永远不会满足的条件,处于停滞状态,称为进程死锁。 1.2 死锁的典型场景??● 申请同类资源:内存资源有 m 个分配单位,然而有 n(n>m) 个进程共享内存资源,进程每次只能申请一个单位满足总量才能使用,且每个进程使用完才一次性释放资源。(假如说,在一个神奇餐厅,有 2 根筷子,此时有 3 个人进来吃饭。①号老哥和②号小姐姐都需要用两根筷子才能吃饭,而③号小老弟只需要一根筷子就能吃饭。然后,他们三去“抢占”资源,如果出现这种情况——“①号和②号分别抢到一根筷子,③号没抢到”,则导致死锁) ??● 申请不同类资源:(假设在办公室里有一把扫把和一个簸箕。然后有两个不同班级的同学来拿“资源”去打扫各自教室的卫生。假如说每个同学一次只能拿走一个东西到各自教室,到教室后需要同时有扫把和簸箕才能开始打扫)
??● 说明:若 “P1” 拿了扫把后。不一会儿,“P2” 又把簸箕拿走了。这时就会导致死锁。两位同学就会在办公室里面傻傻地等着对方释放“资源”。 1.3 死锁的必要条件??① 互斥使用(资源独占):指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 ??② 不可强占(不可剥夺):指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。 ??③ 请求保持(部分分配,占有申请):进程在申请新资源的同时保持对原有资源的占有。 ??④ 循环等待(环路等待条件):指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合 {P0,P1,P2,···,Pn} 中的 P0 正在等待一个 P1 占用的资源;P1 正在等待 P2 占用的资源,……,Pn 正在等待已被 P0 占用的资源。 ??● 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何能够不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。 二、进程死锁的预防机制2.1 机制原理??● 预先确定资源分配,保证不发生死锁,通过破坏死锁 4 个必要条件之一来实现,但破坏 “互斥使用” 这一必要条件不现实。所以一般破坏其他 3 个。 2.2 解决方案??① 破坏“不可剥夺”: ??② 破坏“请求保持”: ??③ 破坏“循环等待”: 三、进程死锁的避免机制3.1 机制原理??● 对进程发出的每一个资源申请进行动态检查,根据检查结果决定是否分配资源,若试分配后可能发生死锁,则不予分配,否则分配。 3.2 银行家算法(Dijkstra在1965年提出) ????????● 银行家算法是著名的死锁避免算法:这是一个银行家给多个顾客分发贷款的算法,可以类比到操作系统给进程分配资源。这时只要把银行家换成操作系统,把顾客换成进程,把资金换成资源,把银行家决定是否放贷时所用的判断过程(即判断顾客是否有信誉和偿还能力)换成操作系统决定是否分配资源时所用的判断过程(即判断进程是否能及时归还资源)即可。 3.2.1 安全状态??● 为了描述银行家算法,下面先介绍一下系统的安全状态的概念: ??◆ 需要注意:
3.2.2 算法实质与思想??● 银行家算法的实质:设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。 ??● 银行家算法的程序思想: 3.2.3 算法所需的相关数据结构??● 考虑一个系统有 n 个进程和 m 种不同类型的资源,现定义包含以下向量和矩阵的数据结构: ??① 可利用资源向量 R e s o u r c e = ( R 1 , R 2 , . . . , R m ) Resource = (R_1,R_2,...,R_m) Resource=(R1?,R2?,...,Rm?)。这是一个含有 m m m 个元素的数组,其中的而每一个元素代表一类可利用资源数目,其初始值是系统中所配置的该类全部可用资源的数目。其数值随该类资源的分配和回收而动态的改变。如果 R e s o u r c e [ i ] = K Resource[i]=K Resource[i]=K,则表示系统中现有 R i R_i Ri? 类资源 K K K 个。【注:后面,也可以用 Available 来表示 Resource】 ??② 最大需求矩阵 M a x Max Max 。这是一个 n ? m n*m n?m 的矩阵,它定义了系统中 n n n 个进程中的每一个进程对 m m m 类资源的最大需求。如果 M a x [ i , j ] = K Max[i,j]=K Max[i,j]=K ;则表示进程 i i i 需要 R j R_j Rj? 类资源的最大数目为 K K K。 ??③ 分配矩阵 A l l o c a t i o n Allocation Allocation 。这也是一个 n ? m n*m n?m 的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果 A l l o c a t i o n [ i , j ] = K Allocation[i,j]=K Allocation[i,j]=K,则表示进程 i i i 当前已分得 R j R_j Rj? 类资源的数目为 K K K。 ??④ 需求矩阵 N e e d Need Need。这也是一个 n ? m n*m n?m 的矩阵,用以表示每一个进程尚需的各类资源数。如果 N e e d [ i , j ] = K Need[i,j]=K Need[i,j]=K,则表示进程 i i i 还需要 R j R_j Rj? 类资源 K K K 个,方能完成任务。 ??⑤ 设 R e q u e s t [ i , j ] Request[i,j] Request[i,j] 是进程 P i P_i Pi? 的申请向量,如果 R e q u e s t [ i , j ] = K Request [i,j]=K Request[i,j]=K,则表示进程 P i P_i Pi? 需要 K K K 个 R j R_j Rj? 类型的资源。 ??上述三个矩阵间存在下述关系: N e e d [ i , j ] = M a x [ i , j ] ? A l l o c a t i o n [ i , j ] Need[i,j]=Max[i,j]-Allocation[i,j] Need[i,j]=Max[i,j]?Allocation[i,j] 3.2.4 算法的设计思想??● 设计思路如下: ??第一部分:银行家算法模块 ??第二部分:安全性算法模块 3.2.5 算法的细节补充??● 当
P
i
P_i
Pi? 发出资源请求后,系统按下述步骤进行检查:(对标第一部分) ??● 系统所执行的安全性算法可描述如下:(对标第二部分) ??● 流程图如下:
3.2.6 算法的实战(样例)??● 题目描述:假定系统中有 5 个进程
{
P
0
,
P
1
,
P
2
,
P
3
,
P
4
}
\{P0,P1,P2,P3,P4\}
{P0,P1,P2,P3,P4} 和 3 类资源
{
A
,
B
,
C
}
\{A,B,C\}
{A,B,C} 各类资源的数目分别是10、5、7。已知
T
0
T_0
T0? 时刻资源分配情况如下: ??● 问题一解答:接下来我们需求出这个状态下的安全序列,也就是将可利用的资源分配给某个 “需要资源小于可利用资源的” 进程,让这个进程运行完成。该进程运行完成之后将会释放资源(也就是将先前分配给该程序的资源重新添加到可利用的资源),然后再执行同样的操作。只要能找到满足 N e e d Need Need 小于 A v a i l a b l e Available Available ,就能分配到资源,让该进程运行完成,最后将资源释放。如果最后每一个进程都能运行完成,就能得到了我们的安全序列,这时该系统就是安全的。否则,不安全。 ??● 执行过程: ??② P 1 P_1 P1? 的 A v a i l a b l e Available Available 小于 N e e d Need Need,分配给 P 1 P_1 P1?。 P 1 P_1 P1? 就能运行完成,最后释放资源 { 2 , 0 , 0 } \{2,0,0\} {2,0,0} 。所以现在的资源就是 { 3 , 3 , 2 } + { 2 , 0 , 0 } = { 5 , 3 , 2 } \{3,3,2\}+\{2,0,0\}=\{5,3,2\} {3,3,2}+{2,0,0}={5,3,2} ??③ 然后继续向下找, P 2 P_2 P2? 不满足条件, P 3 P_3 P3? 满足条件,将资源分配给 P 3 P_3 P3?,让其运行完成,并释放空间 { 2 , 1 , 1 } \{2,1,1\} {2,1,1},所以现在的资源就是 { 5 , 3 , 2 } + { 2 , 1 , 1 } = { 7 , 4 , 3 } \{5,3,2\}+\{2,1,1\}=\{7,4,3\} {5,3,2}+{2,1,1}={7,4,3} ??④ 依次类推得到安全序列为 { P 1 , P 3 , P 4 , P 2 , P 0 } \{P1,P3,P4,P2,P0\} {P1,P3,P4,P2,P0}。过程如下图,其中 F i n i s h Finish Finish 表示进程运行完成。
??● 问题二解答:首先要检测看请求资源是不是比可利用资源、是不是比需要的资源小,如果其中一个或两个条件都不满足,进程等待,如果满足进接下来的操作。这里 { 1 , 0 , 2 } \{1,0,2\} {1,0,2} 是满足这两个条件的。我们进行的操作就是将请求资源加到 A l l o c a t i o n Allocation Allocation 上面,也就是已分配的资源得到扩充。同样的请求的资源一定是来自可利用资源的,所以可利用资源要减去请求资源的数目,因为 N e e d Need Need 和 A l l o c a t i o n Allocation Allocation 的和是一个固定值 M a x Max Max 所以相应的 A l l o c a t i o n Allocation Allocation 加上一个数值, N e e d Need Need 就要减上一个数值,变化之后如下图所示:
四、进程死锁的检测与解决4.1 机制原理??① 允许死锁发生。 ??● 检测时机:定时检测、进程等待时、资源利用率下降时等。 ??● 检测手段:进程-资源分配图(如下图所示)。 4.2 死锁检测??● 检测模型: ??● 检测步骤:(执行过程如下) 4.3 死锁解除??● 资源剥夺法:从其他进程那里剥夺足够数量的资源给死锁进程,以解除死锁状态。 ??● 撤消进程法:撤消全部死锁进程,恢复到正常状态,简单但代价太大。所以一般会按照某种顺序逐个撤消死锁进程,直到有足够的资源供其他未被撤消的进程使用,以消除死锁状态 五、进程死锁问题的思考5.1 死锁原因??① 系统资源不足 5.2 解决原则??① 单独使用死锁预防、避免、检测与解除并不能全面解决操作系统中遇到的所有死锁问题。 六、参考附录:[1] 《操作系统A》 [2] 《操作系统教程》 上一篇文章地址链接: 【操作系统⑨】——进程间通信的概述【kill() signal() shmget() shmat() 实例 共享存储通信 消息通信 管道通信 】. 下一篇文章地址链接: 正在施工中… 🚧 🚧 操作系统系列文章正在更新中… ?? ?? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:52:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |