文章目录
- 死锁(Deadlock)
- 【1】死锁的概念
- 【2】出现死锁的条件
- 【3】处理死锁
- (1)死锁预防
- (2)死锁避免
- (3)死锁检测和恢复
- 【4】鸵鸟算法
- 【5】银行家算法(资源分配拒绝法)
- 基于银行家算法的实例
死锁(Deadlock)
死锁就是进程在等待资源,资源被其他人占着不释放——死循环
【1】死锁的概念
- 进程的死锁,是操作系统OS和软件运行的一种状态
- 在多任务系统下,当一个/多个进程等待系统资源,而资源被其他进程占据且不释放,就形成了死锁
- 死锁:
多个进程循环等待其他进程占有的资源而无限期等待
- 产生死锁的根本原因:
资源有限且进程间推进顺序不当
【2】出现死锁的条件
- 互斥条件
某个资源在一段时间内只能被一个进程占有,不能同时被多个资源占有
- 不剥夺条件(非抢占式)
进程所获得的资源只能自己释放,不能被其他进程抢夺
- 请求和占有条件
进程至少已经占有了一个资源,但又申请了其他资源,由于目标资源又被其他进程占有着,该进程进入阻塞不释放已占有资源
- 环路条件
【3】处理死锁
- 死锁预防、死锁避免、死锁检测、死锁恢复
(1)死锁预防
- 要求进程在申请资源的时候遵循某种协议,保证进程不会进入死锁状态
(1)破坏不剥夺条件:允许进程强行抢走资源
(2)破坏环路等待条件:实行资源预先分配
(2)死锁避免
- 系统在运行中,对进程发出的每一个资源申请都进行动态检测,并根据检查结果决定是否分配资源——若存在风险,则不分配资源
(3)死锁检测和恢复
- 死锁检测算法:
检查并发进程组是否构成资源的请求和占用环路
- 死锁检测算法主要就是检测是否有循环等待
- 发生死锁——资源剥夺法/进程撤销法:
(1)撤销陷入死锁的进程
(2)逐个撤销陷入死锁的进程,直到死锁结束
(3)从陷入死锁的进程中逐个强迫其释放资源,直到死锁消失
(4)从另外的进程中强行剥夺资源分配到死锁进程总,接触死锁状态
【4】鸵鸟算法
- “啥也不干也是一种算法”
鸵鸟在遇到危险的时候会将头买入到土里面,对出现危险不理睬
- 鸵鸟算法:当出现死锁,直接不管!!!!
若死锁的出现概率很小,解决死锁的成本很高则采用鸵鸟算法
【5】银行家算法(资源分配拒绝法)
- 就是对进程的资源申请利用银行家算法进行检测,若不安全就拒绝此次分配资源
- 安全状态:
系统中所有的进程能够按照某一种次序分配资源,并且依次完成,{p1,p2…pn}安全序列
- 银行家算法会设置四个数据结构:
银行家算法的四个数据结构 | |
可利用资源 Avaiable | 描述系统中可用的资源 |
最大需求 Max | 所有进程对资源的总共需求 |
分配 allocation | 系统资源分配 |
需求矩阵 Need | 目前进程还需要的资源 |
- 设进程 Pi 的请求为 request_i ,若 request_i_[ j ] = k 说明Pi需要 k 个 Rj 的资源,当Pi发出请求后,系统进行银行家算法检测
(1)request_i_[ j ] <= Need[i, j] 请求资源小于它本身需要的资源则继续,否则出错
(2)request_i_[ j ] <= Avaiable [ j ] 请求的资源小于系统可利用资源则继续,否则Pi就要进入等待状态
(3)系统开始尝试分配资源,并修改数据结构的值
Available [ j ] = Available [ j ] - request_i_[ j ]
Need [i, j] = Need [i, j] - request_i_[ j ]
Allocation [i, j] = Allocation [i, j] + request_i_[ j ]
基于银行家算法的实例
- 当前系统的资源状态为:
进程 | 已分配资源 | 还需资源 | 可用资源 |
P0 | 0032 | 0012 | 1622 |
P1 | 1000 | 1750 | |
P2 | 1354 | 2356 | |
P3 | 0332 | 0652 | |
P4 | 0014 | 0656 |
(1)该状态是否安全?
(2)若P2提出了资源要求1222系统会满足么?
(1)安全的,可以找到一个安全的序列 P0—P3—P4—P1—P2
(2)
request_2_1222 <= Need_2_2356
request_2_1222 <= Aviaivable_1622
尝试给P2分配资源1222:则P2已分配2576,还需1134,系统可用资源0400,明显无法满足P2的要求了
资源请求拒绝!!!!