【操作系统】——认识一下死锁(Deadlock)

死锁(Deadlock)

死锁就是进程在等待资源,资源被其他人占着不释放——死循环


【1】死锁的概念

  • 进程的死锁,是操作系统OS和软件运行的一种状态
  • 在多任务系统下,当一个/多个进程等待系统资源,而资源被其他进程占据且不释放,就形成了死锁
  • 死锁:

多个进程循环等待其他进程占有的资源而无限期等待

  • 产生死锁的根本原因:

资源有限且进程间推进顺序不当


【2】出现死锁的条件

  1. 互斥条件

某个资源在一段时间内只能被一个进程占有,不能同时被多个资源占有

  1. 不剥夺条件(非抢占式)

进程所获得的资源只能自己释放,不能被其他进程抢夺

  1. 请求和占有条件

进程至少已经占有了一个资源,但又申请了其他资源,由于目标资源又被其他进程占有着,该进程进入阻塞不释放已占有资源

  1. 环路条件

在这里插入图片描述


【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的要求了
资源请求拒绝!!!!

猜你喜欢

转载自blog.csdn.net/weixin_44478378/article/details/105848144