浅谈操作系统中的死锁

操作系统中的死锁,来源于多个进程对资源的争夺。在一组进程发生死锁的情况下,该组中每一个进程都在等待,等待另一个死锁进程所占有的资源。换句话说,每个进程都在等待其他进程当前占有的资源。从逻辑上讲,这组进程就陷入了一种“悖论”,无法自然解决。

定义:

如果一组进程的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。

当然,早期的单用户单任务操作系统就不会出现死锁,因为进程是逐个执行的。但是现在的操作系统都是多用户多任务操作系统,并且许多场景都需要并行执行,所以我们必须考虑如何解决死锁。

解决方案:

  1. 预防死锁。
  2. 避免死锁。不是事先采取限制措施,而是在资源动态分配过程中,用某种方法防止进入不安全状态,从而可以避免发生死锁。
  3. 检测死锁。此方法无须事先采取任何限制性措施,允许进程在运行过程中发生死锁。但是可以通过检测死锁的发生,然后采取适当措施,把进程从死锁中解脱出来。
  4. 解除死锁。当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来。常用方法是撤销一些进程,回收他们的资源,将他们分配给已处于阻塞状态的进程,是其能继续运行。

上述方法,从1到4对死锁的防范程度逐渐减弱,但是对资源的利用率逐渐提高,并发程度提高。

产生死锁的必要条件:

  1. 互斥条件。进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。
  2. 请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
  3. 不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。
  4. 循环等待条件。在发生死锁时,必然存在一个进程-资源的循环链,即进程集合{P0,P1,P2,P3,…,PN}中的P0在等待一个P1占用的资源,P1正在等待P2占用的资源,…… , PN正在等待已被P0占用的资源。此时形成一条首尾衔接的循环链。

这个死锁还有的挖,明天继续死锁之二。

0%