死锁是什么?必要条件?如何解决?
所谓死锁,是指多个进程循环等待它⽅占有的资源⽽⽆限期地僵持下去的局⾯。很显然,如果 没有外⼒的作⽤,那麽死锁涉及到的各个进程都将永远处于封锁状态。当两个或两个以上的进 程同时对多个互斥资源提出使⽤要求时,有可能导致死锁。 〈1〉 互斥条件。即某个资源在⼀段时间内只能由⼀个进程占有,不能同时被两个或两个以 的进程占有。这种独占资源如CD-ROM驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。如独⽊桥就是⼀种 独占资源,两⽅的⼈不能同时过桥。
〈2〉 不可抢占条件。进程所获得的资源在未使⽤完毕之前,资源申请者不能强⾏地从资源占 有者⼿中夺取资源,⽽只能由该资源的占有者进程⾃⾏释放。如过独⽊桥的⼈不能强迫对⽅后退,也不能⾮法地将对⽅推下桥,必须是桥上的⼈⾃⼰过桥后空出桥⾯(即主动释放占有资 源),对⽅的⼈才能过桥。
〈3〉 占有且申请条件。进程⾄少已经占有⼀个资源,但⼜申请新的资源;由于该资源已被另 外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占⽤已占有的资源。还以 过独⽊桥为例,甲⼄两⼈在桥上相遇。甲⾛过⼀段桥⾯(即占有了⼀些资源),还需要⾛其余 的桥⾯(申请新的资源),但那部分桥⾯被⼄占有(⼄⾛过⼀段桥⾯)。甲过不去,前进不能,⼜不后退;⼄也处于同样的状况。 〈4〉 循环等待条件。存在⼀个进程等待序列{P1, P2, ..., Pn},其中P1等待P2所占有的某 ⼀资源, P2等待P3所占有的某⼀源, ......,⽽Pn等待P1所占有的的某⼀资源,形成⼀个进程循环等待环。就像前⾯的过独⽊桥问题,甲等待⼄占有的桥⾯,⽽⼄⼜等待甲占有的桥⾯,从 彼此循环等待。
死锁的预防是保证系统不进⼊死锁状态的⼀种策略。它的基本思想是要求进程申请资源时遵循 某种协议,从⽽打破产⽣死锁的四个必要条件中的⼀个或⼏个,保证系统不会进⼊死锁状态。
<1>打破互斥条件。即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的, 像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并⽆实⽤价值。
<2>打破不可抢占条件。即允许进程强⾏从占有者那⾥夺取某些资源。就是说,当⼀个进程已 占有了某些资源,它⼜申请新的资源,但不能⽴即被满⾜时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽 地强占了。这种预防死锁的⽅法实现起来困难,会降低系统性能。
<3>打破占有且申请条件。可以实⾏资源预先分配策略。即进程在运⾏前⼀次性地向系统申请 它所需要的全部资源。如果某个进程所需的全部资源得不到满⾜,则不分配任何资源,此进程 暂不运⾏。只有当系统能够满⾜当前进程的全部资源需求时,才⼀次性地将所申请的资源全部 分配给该进程。由于运⾏的进程已占有了它所需的全部资源,所以不会发⽣占有资源⼜申请资 源的现象,因此不会发⽣死锁。
<4>打破循环等待条件,实⾏资源有序分配策略。采⽤这种策略,即把资源事先分类编号,按 号分配,使进程在申请,占⽤资源时不会形成环路。所有进程对资源的请求必须严格按资源序 号递增的顺序提出。进程占⽤了⼩号资源,才能申请⼤号资源,就不会产⽣环路,从⽽预防了 死锁
死锁避免:银⾏家算法
Last updated