死锁
一、基本概念
在《现代操作系统》中的定义:
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该集合进程就是死锁的。
百度百科的解释:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁最常见的类型是资源死锁,资源可分为可抢占资源和不可抢占资源。
可抢占资源:
可以从拥有它的进程中抢占而不会发生任何副作用,在这种情况下,死锁可以通过在进程之间重新分配资源而化解,不会产生死锁。
不可抢占资源:
在不引起相关计算失败的情况下,无法把它从占有它的进程处抢占过来,这种情况容易出现死锁。
二、死锁产生的四个必要条件
Coffman等人于1971年总结了发生死锁的四个必要条件:
- 互斥条件:进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放;
- 占有和等待条件:进程占有一个资源,去申请另一个资源,该资源被占用,该进程进入阻塞状态,却不释放自己的资源;
- 不可抢占条件:已经分配的资源是不可抢占的,只能由占有他的进程显示释放;
- 环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
发生死锁时四个条件需要同时满足,可通过破坏条件解除死锁。
三、死锁处理策略
鸵鸟算法
最简单的策略,像鸵鸟一样,把头埋到沙子里,假装没有问题发生,当死锁的发生概率很小,那么可以不必花费性能代价去防止死锁。
检测死锁并恢复
系统不妨止死锁的发生,而是检测死锁发生,当死锁发生后,采取措施进行恢复。
死锁恢复的方法:
- 抢占恢复:将某一资源从一个进程取走给另一个进程使用;
- 回滚恢复:周期性的对进程进行检查点检查,并将当前状态备份,当死锁发生后,回滚到上一个时间点;
- 杀死进程恢复:杀掉环中部分进程,打破环路等待条件。
死锁避免
系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源;如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。
死锁预防
破坏四个条件:
条件 | 处理方式 |
---|---|
互斥 | 一切都使用假脱机技术 |
占有和等待 | 在开始就请求全部资源 |
不可抢占 | 抢占资源 |
环路等待 | 对资源按序编号 |
四、死锁避免算法(银行家算法)
将客户比作进程,贷款数额比作资源,银行家比作操作系统。银行为所有客户预留的可贷款资金少于他们需求的最大值的和,当银行剩余数目无法满足任何一个客户的最大需求时,容易发生死锁。在这种情况下,需要进行合理的调度,才能防止死锁。
银行家算法:
有三个变量:现有资源E、已分配资源P、可用资源A。假设有四种资源,对应的变量分别为:E=(6,3,2,4),P=(5,3,2,2),则A=(1,0,2,0)。
- 查找各进程仍需要的资源,若没有任何一个进程,其没有被满足的资源数均小于或等于A,那么系统将会死锁;
- 若找到一行满足资源数均小于等于A,运行其直到结束,释放他的资源,并将资源加到其他进程上;
- 重复以上两步,当所有进程都终止,其初始状态是安全的。若所有剩余进程的资源需求得不到满足,则发生死锁。
代码放到github上了,链接如下,欢迎指正: