软、硬件资源的抢占都会导致死锁的产生。
资源分为可抢占资源和不可抢占资源。可抢占资源是它可以被其他进程抢占而不产生副作用。不可抢占资源是资源被一个进程占有期间,不可以被剥夺占有权,例如CD刻录机,它的抢占会导致刻录机划坏。
死锁与不可抢占资源有关。死锁的规范定义如下:
如果一个进程集合中的每一个进程都在等待只能由本进程集合其他进程才能引发的事件,那么该组进程是死锁的。
死锁发生的四个必要条件:
- 互斥条件,每一个资源要么分配给了一个进程,要么处于可用状态;
- 占有和等待条件,已分配到一定资源的进程可以申请新进程;
- 不可抢占条件,已分配给一个进程的资源不可以被强制性的抢占,只能由该进程自己释放;
- 环路等待条件,死锁发生时,必然有一条由两个或两个以上进程组成的环路,环路中每一个进程都在等待环路中下一个进程释放资源。
处理死锁有四种策略:
- 忽略该问题,你忽略它,它也忽略你——鸵鸟算法
如果解决死锁的代价很大,而死锁发生的概率又很低,选择不解决这个死锁问题。 - 检测死锁并恢复。让死锁发生,检测它们并采取行动解决问题;
系统监视资源的请求和释放,检测是否存在环路,如果发现有环,则撤销环中某一进程,如果环路仍然存在,继续撤销,直到无环。 - 谨慎地对资源进行动态分配,动态避免死锁;
死锁的预防, - 通过破坏上述四个必要条件之一,来防止死锁的发生。
-
第一种方法:采用某种策略来消除条件1-4中的一个条件的出现来防止死锁【死锁预防】。
-
第二种方法:基于资源分配的当前状态做动态选择来避免死锁【死锁避免】。
-
第三种方法:试图去检测死锁的存在并试图从死锁中恢复出来【死锁检测】