什么是死锁?
指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再次向前推进。在这些进程中,每个进程都无限等待被该组进程中另外一个进程所占用的资源,因而永远无法得到所需要的资源,这种现象被称为进程死锁,这一组进程被称为死锁进程。
产生死锁的原因
- 竞争资源引起进程死锁
① 竞争不可抢占性资源;示例:两个进程共享I/O设备时发生死锁。(A进程占有甲资源,B进程占有乙资源,双方都需要对方的资源,但是都首先释放自己占有的资源,从而造成死锁。)
② 竞争可消耗性资源(临时资源);示例:三进程通信,各个进程都要先接受对方的消息,再释放自己产生的消息,这种情况下,就可能发生死锁。
③ 进程推进顺序不当引起死锁
产生死锁的必要条件
- 互斥
- 请求和保持
- 不剥夺
- 环路等待
解决死锁的方式
- 预防
① 破坏请求和保持条件;在进程运行之前,一次性申请该进程在整个运行过程中所需要的全部资源。或者,允 许一个进程在获得运行初期所需要的资源后便开始运行,在运行过程中,逐步释放自己使用完毕的资源,然后再请求新的资源。
② 破坏不可抢占条件;当某个进程新的资源请求未得到满足时,释放已经占有的所有资源。
③ 破坏循环等待条件;将所有的资源按照类型进行线性排序,规定按照序号递增的次序进行资源的申请。
2. 避免
① 保持系统安全状态(安全状态,是指系统能按某种进程顺序,来为每个进程分配资源,直至满足每个进程对资源的最大需求,使得每个进程都可以顺利的执行。
② 利用银行家算法避免死锁
3. 检测
① 首先做出资源分配图;(用有向图可以将进程死锁描述的准确、形象。计算机系统由若干类资源构成,一类资源称为一个资源类。每个资源类中包含了若干个同类资源,称为资源实例。)
② 然后依据死锁定理进行判断;1)若资源分配图中没有环路,则系统中没有死锁。2)若资源分配图中有环路,且每个资源类中仅有一个资源,则系统发生死锁。3)若资源分配图中有环路,且每个资源类中有多个资源则系统不一定发生死锁。此时有环路是系统发生死锁的必要而不充分条件。
③ 对资源分配图进行简化后判断;当且仅当系统当前状态的资源分配图是不可完全简化的。此时系统状态为死锁状态。这是系统当前状态为死锁状态的充分条件。这一充分条件称为死锁定理。
对资源分配图简化的方法:1)找一个既不阻塞又不独立的进程结点A,去掉它的分配边和请求边,将其变为孤立节点。2)然后将相应的资源分配给一个等待该资源的进程B。进程B运行完之后,去掉进程B的分配边和请求边,将进程B变为孤立结点。3)经过简化后,若使得所有进程结点都成为孤立结点,则称该图是可完全简化的,否则是不可完全简化的。
4. 解除
① 抢占资源;从其它进程剥夺足够数量的资源给死锁进程,来解除死锁状态。
② 终止(撤销)进程;1)直接撤销所有的死锁进程。2)按照某个顺序逐个撤销,直至死锁解除
③ 进程回退
④ 重新启动