死锁

1.死锁

1)所谓死锁是指多个进程因竞争资源造成的一种僵局(相互等待),若无外力作用,这些进程都将无法推进

2)举例

  • 例子1:如果进程A正在使用资源R1同时提出将要使用资源R2的请求,进程B正在使用资源R2同时提出将要使用资源R1的请求,这样两个进程都将无休止地等待下去
  • 例子2:两个山羊过一个独木桥,两只羊同时走到桥中间,一个山羊等另一个山羊过去了然后再过桥,另一个山羊等这一个山羊过去,结果两只山羊都堵在中间动弹不得(对同一个互斥量加锁(down)两次

2.死锁产生的四大必要条件(不是充分,就是说有死锁就一定有这四个,只要这四个缺一个就不会发生死锁)

产生死锁必须同时满足下面四个条件:

1)互斥条件:进程间的制约关系含互斥

2)不可剥夺条件:进程对所持有资源在未使用完毕之前,不能被其他进程强行剥夺,只能是由自己主动释放

3)请求和保持条件:进程已经保持了至少一个资源,但又提出了对新的资源的请求,而该资源被其他进程占有,此时请求被阻塞,但对自己所持有资源保持不放

4)循环等待条件:存在一种资源的循环等待链,链中每一个进程已持有的资源同时被链中下一个进程所请求(但是下一个进程所等待的资源并不一定要上一个进程来满足,可以通过其他进程的释放来满足)。

3.死锁的三种处理策略

3.1预防死锁

1)破坏四大必要条件中的一个或多个,预防发生

  如:破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。

3.2避免死锁

1)避免死锁不那么严格地限制产生死锁的必要条件,而是在资源分配的过程中,用某种算法去避免系统进入不安全状态

2)预防死锁和避免死锁的区别: 预防死锁是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而避免死锁则不那么严格地限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁

3)银行家算法(著名的死锁避免算法)

思想

  • 操作系统是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款
  • 当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按它的申请量给它,否则推迟分配;
  • 当进程在它执行过程中继续申请资源时,要测试该进程已持有资源数和本次申请的资源数之和是否超过了该进程对资源的最大需求量,若超过则拒绝分配;若没有超过,则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按它的申请量给它,否则推迟分配
  • 分配方案确立后,不立即分配,系统还要执行安全性算法,检查按此方案分配后,系统是否处于安全状态。若安全,才正式分配,否则,分配方案作废,需要资源的进程继续等待。

代码

  未完待续

3.3死锁的检测与解除

1)检测

  • 资源有向图:一个用来表述进程间资源分配的有向图,可按照一定的规则进行消边简化,若能消除所有的边,则称该图可以完全简化
  • 死锁定理:当前仅当资源有向图不可以完全简化,则存在死锁

2)解除

  • 资源剥夺法:挂起某些死锁进程,抢占它们的资源,资源分配给其他死锁进程。
  • 撤销进程法:强制撤销部分、甚至全部死锁进程。
  • 进程回退法:让一个或多个进程回退到足以避免死锁的地步,进程回退时自愿释放资源。这种方法要求系统保持进程的历史信息,设置还原点。

4.饥饿

1)等待资源的时间给进程的推进和响应带来明显影响时,称进程发生了饥饿

2)饥饿到一定程度将会被饿死(因为此时已经饿到了进程所赋予的任务即使完成也不再具有实际意义的地步);

3)饥饿有时可以看成是一个进程在无限的等待另外多个进程相互占有的资源,但是这个资源不会往外释放

  举例:资源在其中两个进程相互使用,第三方进程始终得不到。想像一下三个人传球,其中两个人传来传去,第三个人始终得不到

4)死锁一定涉及两个或以上进程,而饥饿进程可能只有一个

原文地址:https://www.cnblogs.com/Joezzz/p/9761232.html