在多道程序系统中,因为多个进程的并发执行,改善了系统资源的利用率并提升了系统 的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。所谓死锁是指多个进程因竞争资源而形成的一种僵局(互相等待),若无外力做用,这些进程都将没法向前推动。
安全
一般系统中拥有的不可剥夺资源,其数量不足以知足多个进程运行的须要,使得进程在 运行过程当中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引发死锁的。并发
进程在运行过程当中,请求和释放资源的顺序不当,也一样会致使死锁。例如,并发进程 P一、P2分别保持了资源R一、R2,而进程P1申请资源R2,进程P2申请资源R1时,二者都 会由于所需资源被占用而阻塞。
信号量使用不当也会形成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这 些进程间没法继续向前推动。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,能够看出进程A和B不是由于竞争同一资源,而是在等待对方的资源致使死锁。ide
产生死锁必须同时知足如下四个条件,只要其中任一条件不成立,死锁就不会发生。spa
互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时如有其余进程请求该资源,则请求进程只能等待。blog
不剥夺条件:进程所得到的资源在未使用完毕以前,不能被其余进程强行夺走,即只能 由得到该资源的进程本身来释放(只能是主动释放)。进程
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其余进程占有,此时请求进程被阻塞,但对本身已得到的资源保持不放。资源
循环等待条件:存在一种进程资源的循环等待链,链中每个进程已得到的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, ..., pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有,如图2-15所示。it
1) 预防死锁class
这是一种较简单和直观的事先预防的方法。方法是经过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被普遍使用。可是因为所施加的限制条件每每太严格,可能会致使系统资源利用率和系统吞吐量下降。循环
2) 避免死锁
该方法一样是属于事先预防的策略,但它并不须事先采起各类限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程当中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
3)检测死锁
这种方法并不须事先采起任何限制性措施,也没必要检查系统是否已经进入不安全区,此方法容许系统在运行过程当中发生死锁。但可经过系统所设置的检测机构,及时地检测出死锁的发生,并精确地肯定与死锁有关的进程和资源,而后采起适当措施,从系统中将已发生的死锁清除掉。
4)解除死锁
这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。经常使用的实施方法是撤销或挂起一些进程,以便回收一些资 源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统得到较好的资源利用率和吞吐量,但在实现上难度也最大。