1. 什么是死锁?
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么改组进程就是死锁的。 也就是说,在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源,或者说每个进程所等待的事件是该组中其他进程释放所占有的资源。但由于所有这些进程都已无法运行,因此它们谁也不能释放资源,致使没有任何一个可以被唤醒。这样这组进程只能无限期待的等下去。
2.产生死锁的必要条件。
虽然进程在运行过程中可能会发生死锁,但产生进程死锁是必须必备一定条件的。产生死锁必须同时具备下面四个必要条件,只要其中任一个条件不成立,死锁就不会发生:
(1)互斥条件。进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。 (2)请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而新的资源已被其他资源占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。 (3)不可挑战条件。进程已获得资源在为使用之前不能被抢占,只能在进程使用完时由自己释放。 (4)循环等待条件。在发生死锁时,必然存在一个进程–资源的循环链,即进程集合{p0,p1,p2, p3,p4…,pn}中的p0正在等待一个p1所占的资源,p1正在等待p2所占有的资源…,pn正在等待p0所占有的资源。
3.处理死锁的方法
(1)预防死锁。这是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或多个来预防产生死锁。 (2)避免思索。同样属于事先预防策略,但他并不是事先采取各种限制策略,去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免发生死锁。 (3)检测死锁。这种方法无需事先采取任何限制性措施,允许进程在运行过程中发生死锁。但可通过检测系统及时检测出出死锁的发生,然后采取适当的措施,把进程从死锁状态中解脱出来。 (4)解除死锁。当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来。常用的方法就是撤销一些进程,回收他们的资源,将它们分配给已处于阻塞状态的进程,使其能继续运行。