进程管理(四):详解死锁

0 死锁

死锁:当若干个进程竞争系统资源或相互通信而处于永久阻塞状态时,若无外力作用,这些进程都将无法正常向前推进。这些进程中的每一个进程均无限地等待此组进程中的某个其他进程占有的、自己永远无法得到的资源,这种现象即为死锁。

举例:某系统中只有一台打印机和一台输入设备,进程1在占用输入设备,同时提出了对打印机的请求。进程2在占用打印机,同时对输入设备提出请求。这种情况下,进程1、2因相互等待而均无法向前推进,故形成死锁。

一个广为流传的例子:

面试官:解释清楚死锁就发offer!

程序员:发offer就解释清楚死锁!

(面试时慎用......)

1 死锁产生必要条件

互斥条件:进程要求对所访问的资源进行排他性控制,即在一段时间内某种资源仅为一个进程占有。

不剥夺条件:进程所获得的某项资源在使用完成前不能被剥夺,即非抢占式使用资源

请求与保持条件:进程每次申请他所需的一部分资源。在等待新资源分配的同时,进程继续占有已分配的全部资源。该条件已成为部分分配条件

环路等待条件:存在一种进程资源循环等待链,而链中每一个占用的资源被链中的下一个进程所请求

2 处理死锁基本方法

鸵鸟算法:像鸵鸟一样对死锁视而不见

预防死锁:破坏必要条件其中之一,预防死锁的形成

避免死锁:在资源动态分配过程中,用某一种算法防止系统进入不安全状态,从而避免死锁(银行家算法)

检测及解除死锁:通过检测机构及时检测出死锁的发生,然后采取措施解除死锁

2.1 死锁的预防:

        破坏互斥条件:允许多个进程同时访问资源,但是这种方法会受到资源本身固有特性的限制。例如:一台打印机不可能同时为两个进程服务。

        破坏不剥夺条件:对于一个已获得部分资源的进程如果新的资源申请不能得到满足,那么该进程立即释放这些已经获得的资源。这种方法实现复杂,频繁地申请和释放资源会增加系统的开销,降低系统的吞吐量。这种方法通常不会用于剥夺资源后代价较大的场合。

        破坏请求与保持条件:采用静态分配的方法,要求程序在其运行前一次性申请所需要的资源,在他的资源未满足之前不能投入运行,一旦进程投入运行,那这些资源一直归属该进程所有,也不能在提出新的资源请求。这种方法降低了资源利用率,导致系统的资源不能得到充分利用。

        破坏环路等待条件:破坏环路等待可以采用资源有序分配法,将所有的资源都按照一个类型进行编号,每一个进程请求资源时都按照同样的顺序请求资源,同类资源一次性请求完。这种方法限制了新设备的增加,同时不同资源的申请顺序不同,因此会造成资源的浪费,同时按序分配资源也增加了程序编写复杂性。

2.2 死锁避免

        安全状态与不安全状态

        若在某一时刻,系统按照某种顺序序列分配资源满足每个进程的需求,使每个需求都顺利完成,那么当前状态称为安全状态。这种分配序列称为安全序列。反之,若某一时刻系统中无法找到这样的一种安全序列,那么当前状态称为不安全状态

        不安全状态是系统中可能发生死锁的状态而并非系统中已经产生了死锁

        只要系统处于安全状态,便可以避免死锁状态。但若不按照某种安全序列的顺序分配资源,仍可能导致死锁。

例:20个相同的进程并发执行,每个进程需要三个资源r,系统中至少有(    )个r资源才能保障不发生死锁。

答:20 * (3 - 1)  + 1 = 41 个  (假设当前20个进程均分别占用2个r资源,这时若只有40个r资源,那么这20个进程均陷入死锁。若此时有一个剩余的r资源,那么任何一个获得该资源的进程能够执行结束,释放3和空闲r资源供其他进程使用,最终20个进程都可以得到执行)

        银行家算法(Dijkstra):

        假设当前系统中有n个进程,m类资源;定义四种数据结构:

Available:是一个m维数组,Available[i]表示当前系统中空闲的i资源的数量

Max:是一个n * m矩阵,它定义了系统中每一个进程对m类资源的最大需求数。Max[i][j]代表进程i对资源j的最大需求量。

Allocation:是一个n * m矩阵,它定义了系统中每一个进程已经分配的m类资源的个数。Allocation[i][j]代表进程i拥有资源j的个数。

Need:是一个n * m矩阵,定义系统中每个进程还需要的资源个数,这个矩阵随着系统动态推进而改变。

Need[i][j] = Max[i][j] - Allocation[i][j]

银行家算法流程图:

安全检查算法流程图

2.3 死锁检测

        资源分配图:集合P = {P1, P2}; R = {r1, r2}; E = {<P1, r2>, <P2, r1>, <r1, P1>, <r1, P1>, <r1, P2>, <r2, P2>}; 

        代表的状态如下:进程P1已经占用两个r1资源,同时正在申请一个r2资源。

                                     进程P2已经占用一个r1资源和一个r2资源,而且正在申请一个r1资源

        申请边:由进程指向资源

        分配边:由资源指向进程

2.4 死锁解除

        剥夺资源:从其他进程中抢占足够多的资源给死锁进程以解除其死锁状态

        撤销进程:撤销一些进程,直到有足够多的资源可以分配给其他的进程

        进程回退:让一个或多个进程回退到足以回避死锁的地步,进程回退时资源释放资源而不是剥夺

3 死锁与饿死

饥饿:在一个动态系统中,一个优先级较低的进程会随着不断到来的高优先级进程而长期被阻塞的状态称为饥饿

饿死:当饥饿到一定程度,该进程所执行的任务即使被执行也不再具有实际意义的时候,称为该进程被饿死

活锁:在忙时等待条件下发生的饥饿称为活锁

死锁:在不受外力的情况下,当前陷入自锁的程序无法正常运行

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值