死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
通常系统中拥有的不可剥夺资源因其数量不足而无法同时满足多个进程运行的需要,因而使得这些进程会因互相争夺资源而陷入僵局,如磁带机、打印机等。
只有对不可剥夺资源的竞争才会引发死锁,多可剥夺资源的竞争是不会引起死锁的。
进程在运行过程中,请求和释放资源的顺序不当,同样也可能会引发死锁。
进程要求对所分配的资源进行排他性使用,即在一段时间内某个资源只能为一个进程所占有,在此期间,若有其他进程来试图请求该资源,则只能等待。
进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己自己来释放(主动释放)。
进程已经至少保持了一个资源,但又提出了新的资源请求,而该资源已被其他进程所占有,此时请求进程被阻塞,且对自已所占有的资源仍然抓着不放。
存在一种资源的循环等待链,链中的每个进程都同时被链中的下一个进程所请求。
资源分配图含圈不一定产生死锁,因为其同类资源数目可能> 1,。因此,资源分配图含圈且一定会产生死锁的充要条件是同类资源数目有且仅有一个。
设置某些限制条件,设法破坏死锁产生的四个必要条件之中的一个或几个。
死锁预防方法是死锁处理策略中最为严苛的一种策略,它能够确保系统不发生死锁。
允许资源能够被共享使用。
该方法不大可行,甚至有时候还需要确保资源的这种互斥性。
当一个保持了某些不可剥夺资源的进程请求新的资源而得不到满足时,它就会释放以及保持的所有资源,待以后需要时再重新申请。
该策略实现起来较为复杂,释放已有的资源可能会导致前一阶段工作的失效,反复地申请和释放资源都会增加系统开销,降低系统吞吐量。这种方法常用于易于保存和恢复的资源,如CPU寄存器、内存等资源,不常用于打印机之类的资源。
采用预先静态分配方法,即进程在运行之前需要一次性申请完它所需要的全部资源而不将它投入运行。一旦投入运行,这些资源就将全部归它所有,并在其运行过程中不再提出其他资源请求。
该方法实现简单,但会严重浪费系统的资源,有些资源甚至只允许一小会而或者运行快结束时才会被用到,该方法甚至还可能产生死锁。
采用顺序资源分配法,首先给系统中的资源进行编号,然后规定每个进程必须按照编号递增的顺序请求资源。(顺序资源分配法)
这种方式会限制新类型设备的增加,同时由于实际作业使用这些资源的顺序可能会与编号顺序不一致,从而会造成资源的浪费。这种方式还会给用户编程带来麻烦。
死锁避免是根据防止系统进入不安全状态采取措施实现的。
安全状态是指系统能按照某种进程推进顺序为每个进程分配其所需的资源,直至满足其对资源的最大需求,使每个进程都可顺利完成,此时则称这个系统处于安全状态,此时进程的执行序列则称为安全序列。
首先我们可以将空闲的2个资源分配给P2,P2满足资源要求并运行完成后,将释放掉4个资源,此时系统中的空闲资源个数为5,然后再将这5个资源分配给P1,P1满足资源要求后开始运行,运行结束后同样释放占有的10个资源,然后空闲资源个数来到了10个,再分配7个资源给进程P3,同样P3进程满足资源要求后开始运行。至此,三个进程均能顺利执行,此时的安全序列为P2 -> P1 -> P3
。
将OS视为银行家,OS管理的资源相当于银行家管理的资金,进程向OS请求分配资源相当于向银行家贷款。OS按照银行家制定的规则对进程分配资源。进程在运行之前先声明对各种资源的最大需求量,当进程在执行过程中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程声明的最大需求量。若超过,则拒绝分配资源;若未超过,则再测试系统当前现存的资源个数能否满足该进程尚需的最大资源量,若能满足则申请分配该资源,否则就需要推迟分配。
死锁检测方法可以提供程序最大的并发性。
资源分配图是一个有向图,用于表示某时刻系统资源与进程之间的状态。
注:从进程到资源的有向边称为请求边,从资源到进程的有向边称为分配边。矩形框代表一类资源,框中的圆圈代表某一类资源中的一个资源。含字符P的圆圈代表一个进程。
首先先找到既没被阻塞又没被孤立的进程P(其相连的有向边所连的资源均申请量小于资源空闲量),然后撤销与之相连的有向边,然后其他进程P以此类推,直至所有进程均被“简化”一遍。
死锁定理的内容:对于一个资源分配图S,S为死锁的条件是S状态的资源分配图是不可完全简化的。
挂起某些死锁进程,并抢占它的资源,然后将这些资源分配给其他的死锁进程。
应注意避免挂起的死锁进程长时间得不到资源而处于资源匮乏的状态。
强制撤销部分甚至全部死锁进程。
撤销的原则可以根据进程的优先级或者撤销进程代价的高低进行。
让一个或多个进程回退到足以避免死锁的地步,进程回退时将自愿放弃所占用的资源。
该方法要求系统能够保持进程的历史信息,设置还原点。
死锁避免方法需要进程所需的资源总量信息,而死锁检测方法则不需要。
死锁避免方法不会给可能导致死锁的进程分配资源,而死锁检测方法会。