Skip to content

死锁概述

目录


参考资料:


为什么会发生死锁呢?这个还要从计算机内的资源说起。

计算机资源属性

按是否可重用,计算机资源可分为两类:

  1. 可重用资源:
    • 可供多个用户多次使用
    • 每个资源单元同一时刻只能被一个进程使用,不允许共享
    • 在使用资源时,需要先请求资源,使用完后再释放资源
    • 系统中可重用资源的单元数一般是固定的,不会随着进程的创建和撤销而改变
    • 例如:打印机、磁带机、磁盘等
  2. 可消耗资源(临时性资源):
    • 在进程运行期间,由进程动态地创建和消耗,数量甚至可以为0
    • 进程获取资源后,可以作为消耗不归还
    • 例如:内存空间、缓冲区等

按是否可抢占,计算机资源可分为两类:

  1. 可抢占资源(不会引起死锁):
    • 一个进程在使用该资源时,CPU 和主存可以抢占资源
    • 例如:内存空间、缓冲区等
  2. 不可抢占资源(可能引起死锁):
    • 一个进程在使用该资源时,CPU 和主存不能抢占资源
    • 例如:打印机、磁带机、磁盘、刻录机(被抢占了就会导致光盘坏掉)等

可以引起死锁的主要采用互斥访问不可以被抢占的资源即临界资源。比如:打印机、磁带机、磁盘、信号量、队列等。

死锁的概念

定义

在前面已经简单介绍过死锁发生的情况,这里给出死锁发生的定义:

在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源。由于所有这些进程已都无法运行,因此它们谁也不能释放资源,致使没有任何一个进程可被唤醒。这样这组进程只能无限期地等待下去。

所以,如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的(DeadLock)

单个进程无法引起死锁,只有多个进程之间才会发生死锁(当然这里不考虑多线程的情况)

死锁产生的条件

一组进程死锁发生的条件有 4,缺一不可:

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

处理死锁的方法

目前处理死锁的方法主要为下面四种:

  1. 预防死锁。这是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。预防死锁是一种较易实现的方法,已被广泛使用。
  2. 避免死锁。同样是属于事先预防策略,但它并不是事先采取各种限制措施,去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免发生死锁。
  3. 检测死锁。这种方法无须事先采取任何限制性措施,允许进程在运行过程中发生死锁。但可通过检测机构及时地检测出死锁的发生,然后采取适当的措施,把进程从死锁中解脱出来。
  4. 解除死锁。当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来。常用的方法是撤消一些进程,回收它们的资源,将它们分配给已处于阻塞状态的进程,使其能继续运行。

上述的四种方法,从上到下对死锁的防范程度逐渐减弱,但对应的是资源利用率的提高,以及进程因资源因素而阻塞的频度下降(即并发程度提高)

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1