所谓死锁(Deadlock)是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。
1. 产生死锁的原因:①竞争资源;②进程间推进顺序非法
2. 产生死锁的必要条件:
①互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。此时若有其他进程请求该资源,则请求进程只能等待。
②请求和保持条件:进程每次申请它所需要的一部分资源,在等待新资源的同时,进程继续占有已分配到的资源。
③不剥夺条件:进程在已获得的资源,在未使用完成之前,不能被剥夺,只能在使用完时由自己释放。
④环路等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
3. 处理死锁的方法:
1) 预防死锁。设置某些限制条件,破坏产生死锁的必要条件中的第②③④个条件之一不能成立来避免发生死锁。
①摒弃“请求和保持”条件。
系统规定所有进程在开始运行之前都必须一次性的申请其在运行过程所需的全部资源。此时,若系统有足够的资源分配给某进程,便可把其需要的所有资源分配给该进程,这样该进程在整个运行期间便不会再提出资源要求,从而摒弃了“请求”条件。在分配资源时,只要有一种资源不能满足某进程的要求,即使其它所需的各资源都空闲,也不分配资源给该进程,而让该进程等待。由于该进程在等待期间并未占有任何资源,因而也摒弃了“保持”条件。
缺点:虽然简单但资源被严重浪费。
②摒弃“不剥夺”条件。
当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请。
缺点:实现复杂,代价较大。释放已经保持的所有资源会造成前段工作的失效,造成前后两次运行的信息不连续。
③摒弃“环路等待”条件
系统将所有资源按类型进行线性排队并赋予不同的序号。所有进程对资源的请求必须严格按照资源序号递增的次序提出,这样,在所形成的资源分配图中,不可能再出现环路。
2) 避免死锁。在资源动态分配过程中,用某种方法防止系统进入不安全状态。银行家算法是著名的死锁避免算法。
3) 死锁的检测及解除。无需采用任何限制性措施,允许进程在运行过程中发生死锁,通过系统的检测机制及时地检测出死锁的发生,然后采取某种措施解除死锁。死锁的检测可利用资源分配图来描述。
死锁解除方法:
①资源剥夺法
②撤销进程法
③进程回退法