【操作系统】死锁

·  阅读 278

1 死锁的基本概念

1.1 死锁的定义

一组进程中,每个进程都无限等待被该组进程中的另一进程所占有的资源,因而永远无法得到资源,这种现象称为进程死锁,这一组进程就称为死锁进程。死锁会导致大量资源浪费。

1.2 死锁出现的原因

资源数量有限,锁和信号量错误使用。
可重用资源:可被多个进程多次使用
可消耗资源:只可使用一次、可创建和销毁的资源

1.3 活锁和饥饿

活锁:先加锁再轮询,既无进展也没有阻塞;
饥饿:资源分配策略导致

1.4 产生死锁的必要条件

互斥使用(资源独占) :一个资源每次只能给一个进程使用
占有且等待(请求和保持) :进程在申请新的资源的同时保持对原有资源的占有
不可抢占:资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
循环等待:存在一个进程等待队列P1,P2,…Pn,其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1的资源,形成一个等待环路。

2 资源分配图

2.1 定义

资源分配图(Resource Allocation Graph,RAG),是用有向图描述系统资源和进程的状态。
二元组G=(V,E)。V:结点的集合,分为P(进程),R(资源)两部分,
P={P1,P2,…,Pm}
R={R1,R2,…,Rn}
E:有向边的集合,其元素为有序二元组,
(Pi,Rj)或(Rj,Pi)

2.2 资源分配图的画法

系统由若干类资源构成,一类资源称为一个资源类;每个资源类中包含若干个同种资源,称为资源实例
资源类:用方框表示
资源实例:用方框中的黑圆点表示
进程:用圆圈中加进程名表示
分配边:资源实例—>进程
申请边:进程—>资源类,如下图所示:
在这里插入图片描述

2.3 死锁定理

如果资源分配图中没有环路,则系统中没有死锁,如果图中存在环路则系统中可能存在死锁。
如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件。

2.4 资源分配图化简

步骤:
1、找一个非孤立且只有分配边的进程结点:去掉分配边,将其变为孤立结点
2、再把相应的资源分配给一个等待该资源的进程:即将该进程的申请边变为分配边
重复1、2步。

3 死锁预防

3.1 解决死锁的方法

  • 不考虑此问题(鸵鸟算法)
  • 死锁预防:是一种静态策略,即设计合适资源分配算法不让死锁发生
  • 死锁避免:是一种动态策略,即以不让死锁发生为目标,跟踪并评估资源动态分配过程,根据评估结果决策是否分配
  • 死锁检测与解除

3.2 死锁预防(DeadLock Prevention)

定义:在设计系统时,通过确定资源分配算法,排除发生死锁的可能性
具体做法:破坏产生死锁的四个必要条件之一。

3.2.1 破坏“互斥使用”条件

资源转换技术:把独占资源转换成共享资源

3.2.2 破坏“请求和保持”条件

1 实现方案1:要求每个进程在运行前必须一次性申请它所要求的的所有资源。但是该方案资源利用率低,而且容易产生饥饿现象。
2 实现方案2:在允许进程动态申请资源的前提下规定,当一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请。

3.2.3 破坏“不可抢占”条件

实现方案:当一个进程申请的资源被其他进程占用时,可以通过操作系统抢占这一资源(两个进程优先级不同)。该方案的局现性在于:适用于状态易于保存和恢复的资源。

3.2.4 破坏“循环等待”条件

通过定义资源类型的线性顺序实现。
实现方案:资源有序分配法,具体来说就是,把系统所有资源编号,进程在申请资源时必须严格按照资源编号的递增次序进行,否则操作系统不予分配。

4 死锁避免

4.1 定义

在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统发生死锁或可能发生死锁,则不予分配。

安全状态:如果系统中存在一个由所有进程构成的安全序列P1,P2,…,Pn,则系统处于安全状态。

4.2 安全序列

一个进程序列{P1,P2,…Pn}是安全的,如果对于每一个进程Pi(1≤i≤n):
它以后还需要的资源量不超过系统当前剩余资源量与所有进程Pj(j<i)当前占有资源量之和,则成系统处于安全状态。安全状态一定没有死锁发生,不安全状态一定导致死锁

4.3 一种典型的死锁避免算法——银行家算法

【操作系统】死锁避免之银行家算法

5 死锁检测与解除

5.1 死锁检测

允许死锁发生,但是操作系统会不断监视系统进展情况判断是否发生死锁;一旦发生死锁,将会解除死锁并以最小的代价恢复操作系统的运行。

检测时机:
1、当进程由于资源请求不满足而等待时检查死锁,缺点是系统开销大
2、定时检测
3、系统资源利用率下降时检测死锁

5.2 死锁解除

死锁解除最核心的是以最小的代价恢复系统的运行。有如下方法:

  • 撤销所有死锁进程
  • 进程回退(Rollback)再启动
  • 按照某一原则逐一撤销死锁进程,直到死锁解除
  • 按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前的对应状态),直到死锁解除
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改