死锁是在多个进程(两个或两个以上)在执行中由于竞争资源或通信设计不合理产生的一种永久阻塞的现象。
死锁产生的四大必要条件有:
一、资源的互斥和不可剥夺性。
a、互斥条件:一个资源只能被一个进程使用。
b、不可剥夺条件:进程在使用此资源时,若该进程不主动释放,无法被强制剥夺
二、进程占用了其他进程所需要的资源
a、请求与保持条件(部分分配):进程在请求其他资源时,同时占用了至少一个资源,并且在阻塞时不释放此类资源。
三、程序设计的不合理性
a、循环等待条件:若干进程之间形成进程-资源请求环形链。
如何避免:
一、事先采取措施破坏四大必要条件:
a、改变互斥条件:改造资源为虚拟资源,但是由于部分资源无法改造,且同时应保护资源的互斥性。
b、改变不可剥夺条件:当进程请求得不到满足时,必须释放当前所占用的资源,待需要时再重新申请,但是这种方法只适合易于保存和恢复的资源,且反复的释放和申请资源会导致系统吞吐量降低,开销较大。
c、改变请求和保持条件:设置进程在运行前一次性申请所有的资源,在所有资源未满足的时候,不投入运行,一旦运行后,也保证不再提出其他资源请求。这种方法会造成资源的浪费,由于资源在进程中的使用时间不同,某些资源仅仅在进程的运行中只占据很短的时间,造成其他等待该资源的进程迟迟不能执行,降低系统的性能。
d、改变循环等待条件:有序资源分配法。
<有序资源分配法> 给资源编号,进程对于同一类的资源必须一次性申请完毕,对于不同类型的资源则按照顺序申请,但是这样做限制了新类型设备的添加,且资源的使用顺序有可能和系统的使用顺序冲突,也会给用户编程带来麻烦。
二、资源的分动态配过程中,采取措施防止系统进入不安全的状态:
a、系统安全状态的检测:系统在分配进程资源前计算此次分配资源的安全性,若安全则分配,否则则让进程等待。
b、银行家算法:操作系统当前的资源量为s_os_cur,当进程首次申请资源s_p_1,获取进程最大需求量s_p_max,当s_os_cur >= s_p_max时,操作系统分配资源s_p_1,否则推迟分配。当进程在执行时申请资源s_p_2时,先计算进程已占用资源数s_p_cur,计算s_p_cur + s_p_2 <= s_p_max,若不符合则拒绝资源分配,符合则继续计算当前系统的s_os_cur是否满足进程还需的最大资源需求量,满足则分配,不满足则让进程等待。
三、利用系统的检测措施,检测到死锁,并对进程采取操作,解除死锁。