死锁问题
一、什么是死锁?
所谓死锁是指多个进程因竞争资源而相互等待,若无外力作用,这些进程都无法向前推进。
二、死锁是怎样产生的?
- 系统资源的竞争 当不可剥得资源的数量不足以满足进程的需要时,使得进程会因为争得资源而陷入僵局
- 进程推进顺序不当 进程在运行过程中,请求和释放资源的顺序不当,也会造成死锁。例如并发进程\(P_1,P_2\)分别保持了资源\(R_1,R_2\),而进程\(P_1\)申请\(R_2\),同时进程\(P_2\)申请\(R_1\),两者都会因为所需资源被占而阻塞。信号量使用不当也会造成死锁。
三、死锁产生的条件
产生死锁必须满足以下四个条件,缺一不可:
- 互斥条件 一个资源只能被一个进程所占用,此时若其它进程请求该资源,则请求进程必须等待
- 不剥得条件 进程使用的资源在未完成使用之前,不能被其它进程强行得走。
- 请求和保持条件 一个进程因为请求资源而阻塞时,对已获资源保持不放
- 循环等待条件 若干进程形成了一种头尾相接环状等待资源的关系
四、死锁的处理策略
- 预防死锁 破坏死锁产生的四个必要条件之一
- 避免死锁 在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁
- 死锁检测及解除 通过系统检测机构及时的检测出死锁的发生,然后采取某种策略解除死锁
1)死锁预防
死锁预防就是破坏死锁产生的四个条件之一。
- 破坏互斥条件 有些资源根本不能同时访问,如打印机,所以破坏互斥条件而预防死锁的方法一般不太可行。
- 破坏不可剥得条件 当一个保持了某些不可剥得资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的资源,待以后需要时再申请。这就意味着一个进程已占有的资源会被暂时释放掉或者说是被剥得了。特点:释放已获得资源可能会造成前一段工作失效,实现复杂、降低了系统吞吐量。
- 破坏请求和保持条件 这种策略要求进程在申请资源时,它不能占有其他资源,也就是需要进程在执行前一次性申请并获得所有的资源。这种特点是:资源利用率低(资源已分配,但长时间未使用),可能发生讥饿现象(一个进程需要多个常用资源,可能会永久等待,因为它需要的资源至少有一个已经分配给其它进程)
- 破坏循环等待条件 该策略需要对所有的资源进行排序,要求每个进程必须按照递增顺序来申请资源。这种方法问题是编号必须相对稳定,这就限制了新类型的增加...(还没写完)
2)死锁避免
死锁避免方法中,允许进程动态的申请资源,但是系统进行资源分配之前,应该先计算此资源的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程,否则让进程等待。
系统安全状态 所谓安全状态是指系统能够按照某种进程推进的顺序(\(P_1,P_2,...,P_n\))为每个进程\(P_i\)分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以胜利的完成。此时称(\(P_1,P_2,...,P_n\))是安全序列。如果系统无法找到一个安全序列,则系统处于不安全状态。需要注意的是并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入四锁状态。