操作系统 死锁
文章目录
- 1、资源
- 2、死锁的概念
- 3、死锁的必要条件
- 4、死锁的处理策略
- 4.1 忽略死锁
- 4.2 检测死锁并恢复
- 4.3 避免死锁
- 4.4 预防死锁
1、资源
把需要排他性使用的对象称为资源。资源可以是硬件也可以是软件,比如打印机或者数据库中的一个加锁记录。
资源可以分为两类:可抢占资源和不可抢占资源。
- 可抢占资源:可以从拥有它的进程中抢占而不产生副作用。
- 不可抢占资源:不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来。
抢占这个词,在进程和线程调度时就提到了这个概念,那时是进程或者线程可以抢占CPU,即抢占式调度。存储器也可以抢占,如内存换页。
一般来说,可抢占资源不会引起死锁,可以在进程间重新分配资源而得到解决。
2、死锁的概念
如果一个进程集合中,每个进程都在等待只能由该集合中其他进程才能引发的事件,那么该进程集合就是死锁的。
死锁并不仅仅发生在资源上,资源死锁只是一种。
本篇博客将围绕资源死锁来主要介绍。
3、死锁的必要条件
参考此篇博客:https://www.cnblogs.com/lustar/p/8087496.html
一般来说,死锁的必要条件共有4个:
- 互斥:至少有一个资源必须处在非共享模式,即一次只能有一个进程使用,如果另一进程申请该资源,那么申请进程必须延迟直到该资源释放为止。
- 占有(占用)并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。即:资源不能被抢占
- 不可(非)抢占:已经分配给一个进程的资源不能被抢占,只能由占有它的进程显式地释放。
- 循环(环路)等待:死锁发生时,系统中一定有由两个或以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。即:有一组进程{P0,P1,…Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,Pn-1等待的资源被Pn占有,Pn等待的资源被P0占有。
4、死锁的处理策略
- 忽略死锁:一般称为鸵鸟算法,即躲起来视而不见。
- 检测死锁并恢复:让死锁发生,检测它们是否发生,一旦发生死锁,就采取行动解决问题。
- 避免死锁:仔细对资源进行分配,动态地避免死锁。
- 预防死锁:通过破坏引起死锁的四个必要条件,防止死锁的发生。
4.1 忽略死锁
采用鸵鸟算法,即一种计算机操作系统算法,用于当死锁真正发生且影响系统正常运行时,手动干预 ——> 重新启动。
传说中鸵鸟看到危险就把头埋在地底下。当你对某一件事情没有一个很好的解决方法时,那就忽略它,就像鸵鸟面对危险时会把它深埋在沙砾中,装作看不到。这样的算法称为“鸵鸟算法“。这实在不算是一个算法,但却是目前实际系统采用最多的一种策略。例如在计算机操作系统中,当死锁真正发生且影响系统正常运行时,手动干预 ——> 重新启动。
在计算机科学中,鸵鸟算法是一个忽略潜在问题的一种算法策略,这种策略对计算机程序可能出现的问题采取无视态度(类似于鸵鸟在遇到危险时将头埋在地里,装作看不见)。鸵鸟算法的使用前提是,问题出现的概率很低。
4.2 检测死锁并恢复
采用这种办法的时候,系统并没有试图阻止死锁的发生,而是允许死锁发生,检测到死锁后,采取措施进行恢复。
该方法分为两个阶段:检测、恢复
- 检测:我们知道,死锁的一个必要条件是存在两个及以上进程组成的环路。通过检测有向图环路,是一种检测死锁存在的方法。
然而,当每种类型存在多个资源时,检测可能会复杂许多。 恢复:拥有以下几种方法:
- 利用抢占恢复。死锁发生的必要条件,其中一个就是不可抢占。如果允许抢占,那么就可以破坏死锁条件。
- 利用回滚:周期性对进程进行检查点检查,一旦发现了死锁,就回滚到一个较早的检查点上。
- 通过杀死进程:这个方法是最显而易见的。杀死一个进程可以释放它占有的资源,如果仍然不行那么久继续杀死其他进程直到打破死锁。
4.3 避免死锁
- 资源轨迹图
如果直到了进程在各个阶段需要哪些资源,那么可以在图中进程标注。两个进程的交叠区域就是一个会造成死锁的区域。进程在图中只能向右或者向上前进,一旦进入了危险区,那么就可能发生死锁。为了避免死锁,应当在合适的时间阻塞某个进程,使得运行避开这个区域。 - 银行家算法
银行家算法可以推广到多个资源的情况,此时可以写成矩阵的形式,每次判断一行是否满足,即一个进程的多个资源都进行检查。
但是需要注意到,死锁避免是非常困难的,无论是资源轨迹图还是银行家算法,都需要事先知道进程运行的过程中需要的最大资源数,这几乎是不可能实现的!
4.4 预防死锁
死锁避免可以认为是在程序执行中动态地避免死锁发生,而死锁预防可以说是静态的方式,杜绝死锁发生的可能性。
事实上,只要能破坏死锁发生的四个必要条件之一,那么死锁就不会发生。
- 破坏互斥条件
尽量使得资源不被某个进程独占。比如打印机的假脱机打印,就是尽量避免一个进程独占打印机,而是把要打印的文件存入一个假脱机目录,然后通过一个守护进程管理打印机进行打印。 破坏占有(占用)并等待条件
禁止已经持有资源的进程再等待其他资源。- 一种方式是,在进程开始执行前请求所需的全部资源,如果不能满足,那么就不分配资源,进行等待。这种方式的问题在于,类似银行家算法,事先不知道需要多少资源,而且资源利用率不高。
- 另一种方式就是,当一个进程请求资源时,先暂时释放其当前所占用的所有资源,然后再尝试一次获取所需的全部资源。
- 破坏不可(非)抢占条件
允许资源抢占即可。当然,有的时候资源应当是不可抢占的。 - 破坏循环(环路)等待条件
对资源进行编号,进程在任何时候都可以请求资源,但是所有的请求必须按照资源编号的顺序(升序或降序)提出。
还没有评论,来说两句吧...