死锁产生的原因
1)竞争可重用不可抢占式的资源
2)竞争可消耗资源
3)进程推进顺序不当.
可重用性资源:可供重复使用多次的资源.
不可抢占性资源:一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程使用完后自动释放.
可消耗资源:又叫临时性资源,它是在进程运行期间,由进程动态的创建和消耗的.
产生死锁的四个必要条件
1)互斥条件:一个资源每次只能被一个进程使用;
2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
3)不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺;
4)环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
一、预防死锁
预防死锁的发生只需破坏死锁产生的四个必要条件之一即可。
1)破坏互斥条件:
如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有点场合应该保护这种互斥性。
2)破坏请求与保持条件:
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复的申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保护和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。
3)破坏不可剥夺条件:
采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足之前,不能把他投入运行。一旦投入运行后,这些资源就一直归他所有,也不在提出其他资源请求,这样就可以保证系统不会发生死锁。
这种方式实现简单,但是缺点也很明显,系统资源被严重浪费,其中有些资源可能仅在出行初期或运行快结束时才使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
4)破坏环路等待条件:
为了破坏循环等待条件,可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。
这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑大多数作业实际使用这些资源的排序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。
二、避免死锁
银行家算法。
三、检测死锁
死锁定理
四、解除死锁
1)从死锁进程处剥夺资源
2)终止部分或全部进程