【系统架构设计师】第一章:操作系统(1.2.3)死锁问题

这一章本来计划写pv操作的后续,写几个实际的题目。
不过由于条件不是很允许,这里就不写了。我们这一节直接往后写,关于死锁的问题。
上一章:
【系统架构设计师】第一章:操作系统(1.2.2) 信号量与pv操作

1.2.3 死锁

这里先介绍一下死锁问题的产生。

上一节我在pv操作的时候写过,在控制进程同步的时候,p和v分别用了两个信号量。为了使进程A对进程B进行等待,就需要开启A之后在开启B。

然而,有时候我们在开启A之后,因为某些特殊的原因,导致进程B没有开启,最后让进程A一直处于等待态。

这些特殊原因有很多,比如有时候人工造成的,又或者是因为系统的资源不足最终导致没有办法运行B等等之类的各种原因。总之,最后导致的结果就是,我们的A进程一直处于等待态,无法继续运行。

这样,我们就称其为锁死

因此,我们就可以得出锁死的概念:
当一个进程在等待一个不可能的事件的时候,我们就称其为锁死状态。

锁死的原因

归根结底,我们进程产生锁死的原因就是因为某个进程在等待一个不可能的事件产生的。当多个进程被锁死,就造成了系统的锁死。
所以,这里给出了4个死锁产生的条件:

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 保持与等待条件:一个进程已经获得一些资源,但是由于其他资源没有满足,最终导致不放已拥有的资源。
  3. 不可抢占资源:因为有些资源是不可抢占的,当一个进程获得这些资源以后,保持不放,而系统也无法强行收回,最终只能等待进程自己释放。
  4. 循环等待条件:许多进程形成环形链,每个进程都占用着对方要申请的资源。

最后这条我认为是对系统危害最大的,因为形成环以后,一个进程被锁死,就会引发连锁反映,导致所有进程都被锁死。

死锁的解决策略

为了针对死锁,系统主要使用了以下的策略来解决死锁问题。

  1. 死锁预防:我们前面说过死锁产生的四个必要条件,我们只要破坏其中的一个即可。比如,我们可以让进程一次性分配到所有资源,这样就不会有其他资源没有得到满足而锁死。而我们想解决环路锁死的问题,只要让上一层得到资源,然后才申请能下一层的资源即可。不过一般采用这样的方法会导致系统效率下降。
  2. 死锁避免:采用一些特殊算法,提前进行推算需要被分配的资源量。这样做的缺点是会导致系统开销增加。
  3. 死锁检测,死锁解除:书上将这两种分开写,我认为这两种应该是合到一起的。系统会执行死锁检测,如果是,那么就会执行死锁解除策略,强行收回系统资源,分配给其他进程使用。
  4. 不理睬策略:又称鸵鸟策略。当发生死锁的时候,有时候会不进行理会。正如我们所说,解决不了问题,就忽视问题。
银行家算法

上面我们提到了死锁的避免,银行家算法就是避免死锁的算法之一。

先看看书上是怎么写的。

银行家算法是指在分配资源之前先看清楚资源分配后是否会导致系统锁死。如果会,就不分配,否则就分配。
按照银行家算法的规则,系统将按照一些的规则进行分配:
1.一个进程对资源的最大需求量不超过系统中资源的可用数时可以接纳该进程
2.进程可以分期请求资源,但是需求总数不能超过最大需求量
3.当当前的资源无法满足进程的需求总数时,对进程可以推迟分配,但总能使进程在有限的时间分配到所需要的资源
4.当系统现有的资源不能满足所需资源数,必须测试当前资源数是否能满足进程所需要的最大资源数,否则也要推迟分配。

这个是比较重点的地方。书上写的其实我感觉很像规则,因为写的都是“当xxx时,按照xxx分配。”
其实是因为书上给的其实是银行家算法的核心思想。这里给了一篇银行家算法的源码,有兴趣可以看看。
https://www.cnblogs.com/mfrbuaa/p/3812500.html
我们只需要理解其核心思想即可,不需要理解代码是怎么写的。

为了更好理解银家算法,我这里摘取了一个书上的例子进行讲解。
在这里插入图片描述
根据题目可以得出这样的条件:
目前,5个进程的R1,R2,R3的占用量是:7,7,5
因此,得出当前资源的剩余量是:R1,R2,R3-----2,2,0
很好算吧?一减就有了。

先想想第一种,按照P1-P2-P3-P4-P5的顺序来执行的结果。

(以下我就省略R1,R2,R3了)

在没执行之前,我们的资源剩余量是:2,2,0

当执行P1时,由于已经分配了1,2,1的资源,离最大资源还差5,3,1

系统在执行分配时,将所剩下所有资源都分配给P1,但是发现不够。此刻还差资源3,1,1

很明显,我们的资源没有得到满足,由于P1已经将资源全部分配,所以最终导致所有进程都处于阻塞态,也就是锁死。

这个例子我觉就是一个典型的循环等待。

接着我们想想第二种,如果按照P2-P4-P5-P1-P3的顺序执行会发生什么。

首先执行P2。

此刻我们的资源剩余量是2,2,0 。而P2占用了2,1,1 。此刻只需要R2的1个资源量即可。

当顺利执行完成P2以后,资源释放,目前可用资源是4,3,1

接着执行P4,P5,P1,P3,以次类推。

你会发现,如果按照这样的顺序执行,我们的系统是可以刚刚好完成5个进程的执行,并且不会发生死锁的问题。

因此,通过对比,我们可以发现,使用银行家算法可以有效的防止系统锁死的发生。

关于死锁的问题就先讲这么多,剩下的想到在补充吧。
下一节是关于管程的内容,已更新。
【系统架构设计师】第一章:操作系统(1.2.4)管程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值