Skip to content
EN

#系统分析师

#面试题

死锁的原因

死锁(Deadlock)是指多个进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,导致这些进程或线程都无法继续执行下去。死锁的产生通常需要满足以下四个必要条件(称为死锁的四个必要条件):

  1. 互斥条件(Mutual Exclusion):资源一次只能被一个进程占用,其他进程必须等待该资源释放后才能使用。
  2. 占有并等待(Hold and Wait):进程已经占有了至少一个资源,但又申请新的资源,而该资源被其他进程占用,导致该进程阻塞。
  3. 非抢占条件(No Preemption):已经分配给进程的资源不能被其他进程强行抢占,必须由进程自行释放。
  4. 循环等待(Circular Wait):存在一个进程等待的循环链,每个进程都在等待下一个进程所占用的资源。

死锁的处理策略

Java

处理死锁的策略主要有以下几种:

  1. 预防死锁(Deadlock Prevention)

    • 通过破坏死锁的四个必要条件中的一个或多个来预防死锁的发生。
    • 例如,可以通过资源一次性分配(破坏占有并等待条件)或允许资源抢占(破坏非抢占条件)来预防死锁。
  2. 避免死锁(Deadlock Avoidance)

    • 在资源分配时,系统通过某种算法(如银行家算法)来预测是否会导致死锁,从而决定是否分配资源。
    • 这种方法需要系统知道每个进程的资源需求,并且需要动态地检查资源分配状态。
  3. 检测与恢复(Deadlock Detection and Recovery)

    • 系统定期检测是否存在死锁,如果检测到死锁,则采取恢复措施。
    • 恢复措施可以包括终止某些进程、回滚操作或强制释放资源等。
  4. 忽略死锁(Deadlock Ignorance)

    • 有些系统选择忽略死锁问题,认为死锁发生的概率很低,或者处理死锁的代价过高。
    • 这种方法通常用于简单的系统或死锁发生概率极低的环境中。