死锁的产生与处理

一.死锁的概念

在生产者-消费者模型中可能出现的问题:
在这里插入图片描述
在该模型中,我们设置了两组信号量,一组用来表示可调用资源的个数,另一组用来保证进程互斥。如果我们将互斥信号量mutex和资源信号量empty,full按照图示顺序编写,就可能导致死锁的产生。

我们不妨设当前资源信号量为0,那么我就说执行生产者进程时,mutex变为0,empty变为-1,生产者进程阻塞;此时调用消费者进程,mutex变为-1,消费者进程也阻塞;这就是死锁的产生。

死锁的定义:多个进程由于互相等待对方持有的资源而造成谁都无法继续执行的情况。

二.死锁产生的必要条件

(1)互斥条件

进程涉及的资源是非共享的,只能同时供一个进程使用。

(2)不可抢占条件

一个进程执行过程中不能抢占另一个进程所持有的资源

(3)请求保持条件

一个进程申请调用其他资源时依然会占有自己已经持有的资源

(4)环路条件

在资源分配图中存在一个环路,环路中每一个进程持有的资源同时被下一个进程所请求。

三.死锁处理

(1)死锁预防

通过限制条件去破坏死锁的四个必要条件中的一个或多个,从源头上预防死锁的产生。
该方法的实现较为简单,但是以一种悲观锁的心态去预防死锁的产生降低了系统利用率

具体做法:

1.在一开始便申请完成一个进程所需的所有资源。
2.按照一定的次序对资源申请进行排序,破坏环路等待条件。

(2)死锁避免

通过某种方法测试每个资源的请求是否会让系统进入不安全状态,如果会则拒绝执行
该方法因为事先并没有设置很强的限制措施,得到了较高的系统资源利用率和系统吞吐量,但是在实现上存在困难。

安全状态如果系统能够按照某种资源分配顺序使得所有进程都能运行完成,则该系统此时处于安全状态
对应的序列就叫做安全序列。若不存在这样一个安全序列则称该系统处于不安全状态

安全状态与死锁的关系
安全状态下一定不会出现死锁,但是不安全状态下也可能不会会出现死锁。

安全序列的寻找
在这里插入图片描述
如图所示可能的一种安全序列为:P3->P1->P4->P2->P0

对应的算法实现(银行家算法):
在这里插入图片描述

(3)死锁检测与恢复

既不事先设置限制条件预防死锁的发生,也不对可能造成死锁的资源请求进行检测,而是在死锁发生之后让一些进程回滚,让出资源。
同样能得到较高的资源使用率,但在实现上存在困难。

死锁避免中使用的银行家算法由于系统中的资源数目和进程数目过多,时间复杂度过高,导致了额外的系统开销。为了解决这个问题,我们可以选择定时检测或在资源利用率低时检测的方法来减少系统开销,然后再通过业务回滚处理死锁

(4)死锁忽略

对于PC机这种重启影响不大的情况下,可以选择忽略死锁,直接重启所有进程。

猜你喜欢

转载自blog.csdn.net/m0_46550452/article/details/108194252
今日推荐