一、死锁的概念
- 死锁的概念
死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进行都将无法向前推进。 - 死锁产生的原因
- 系统资源的竞争。 只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争时不会引起死锁的。
- 进程推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当。
- 死锁产生的必要条件。死锁的产生必须同时满足以下4个条件,只要其中一个条件不成立,死锁就不会发生。
- 互斥条件。 进程要求对锁分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有,此时若有其他进程请求该资源,则请求进程只能等待。
- 不剥夺条件。 进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能时主动释放)。
- 请求并保持条件。 进程已经保持了至少一个资源,但是又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞,但对自己获得的资源又保持不放。
- 循环等待条件。存在一种进程资源的循环等待链,链中的每个进程已获得的资源同时被链中下一个进程所请求。
二、死锁的处理策略
为了使系统不发生死锁,破坏产生死锁的4个必要条件之一,或允许死锁发生,但当死锁发生时,能检测出死锁,并有能力实现恢复
- 死锁预防
设置某些条件,破坏产生死锁的4个必要条件中的一个或几个,以预防发生死锁。 - 死锁的避免
在资源的动态分配过程中,用某种方法阻止系统进入不安全状态,从而避免发生死锁 - 死锁的检测以及解除
无需采取任何限制措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。
三、死锁的预防
- 破坏互斥条件
若允许系统资源能共享使用,则系统不会进入死锁状态 - 破坏不剥夺条件
当一个保持了某些不可剥夺资源的进程请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。 - 破坏请求并保持条件
采用预先静态分配的方式,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把他投入允许。一旦投入运行,这些资源就一直归他所有,不再提出其他资源请求。 - 破坏循环等待条件
为了破坏循环等待条件,可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源后,就只能申请编号大于当前申请资源的资源。
四、死锁的避免
避免死锁同样属于实现预防策略,但并不是实现采取某种限制措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件比较弱,可以获得较好的系统性能,
- 系统安全状态
所谓安全状态,是指系统能按照某种进程推进顺序为每个进程分配其所需要的资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成。此时成进程的序列为安全序列,否则则称系统处于不安全状态
避免死锁的方法中,允许进程动态地申请资源,但系统在进程资源分欧文之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程,否则让进程等待。 - 银行家算法
- 把操作系统视为银行家,操作系统管理的资源相当于银行管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款,操作系统按照银行家指定的规则为进程分配资源
- 当进程首次申请资源时,要测试该进程对资源的最大需求量,若系统显存的资源可以满足它的最大需求量,则按当前的申请量分配资源,否则就推迟分配。
- 当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程对资源的最大需求量。若超过则拒绝分配资源。若未超过则再测试系统显存的资源能否满足该进程尚需的最大资源量,若能满足,则按当前的申请量分配资源,否则也要推迟分配。
五、 死锁的检测和解除
- 死锁检测
- 资源分布图。用圆表示一个进程,用框表示一类资源,用框中的圆表示资源的一个单位。从进程到资源的箭头表示请求,从资源的进程的箭头表示分配。
- 死锁定理。 简化资源分布图可检测系统状态S是否为死锁状态
- 找出既不阻塞又不孤点的进程Pi,消除其所有的边, 使其称为孤立点
- 进程Pi所释放的资源,可以唤醒某些因等位这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。
- 若能够消除所有的边,则成该图是完全简化的。
- S为死锁的条件时当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理
- 死锁解除
- 资源剥夺法。 挂起某些死锁进程,并抢占他们的资源,将这些资源分配给其他的死锁进程。但应预防被挂起的进程尝时间得不到资源而处于资源匮乏状态
- 撤销进程法。 强制撤销部分甚至死锁进程并剥夺这些进程的资源。撤销的原则可以按进程的又漫长和撤销的代价的高低进行。
- 进程回退法。让一(或多)各进程回退到足以避免死锁的底部,进程回退时资源释放资源而并非剥夺。要求系统保持进程的历史信息,设置还原点