什么是死锁?

什么是死锁?
最新回答
枯墨云

2021-11-13 13:59:37

死锁是进程间因资源竞争陷入无限等待的状态,即两个或多个进程无限期地相互等待对方释放资源,导致所有进程都无法继续执行。以下从死锁的产生条件、检测方法、避免策略和恢复策略展开介绍:

  • 死锁的产生条件:死锁的产生需同时满足四个必要条件,打破任一条件即可预防。

    互斥:资源一次只能由一个进程占用,如打印机等独占设备。

    占有且等待:进程持有至少一个资源,同时等待获取其他被占用的资源。

    不可剥夺:已分配给进程的资源,在该进程未主动释放前,其他进程无法强行夺取。

    环路等待:存在一个进程的循环链,链中每个进程都在等待下一个进程所占用的资源。

  • 死锁的检测方法

    资源分配图结合DFS检测环路:资源分配图是有向图,节点代表进程和资源,边代表进程请求或持有资源。若图中存在环路,则可能存在死锁,可使用深度优先搜索(DFS)算法检测环路。

    银行家算法:该算法能检测并避免死锁,需维护系统中资源耐茄正分配和请求的详细信息,计算复杂度较高,但可提供可靠的死锁检测。不过,许多操作系统和数据库系统并不总是主动检测死锁,而是选择在发生超时或资源请求失败时才进行处理,这种策略称为死锁纳高避免或死锁忽略。

  • 死锁的避免策略:避免死锁的关键在于打破死锁的四个必要条件之一。

    破坏互斥条件:理论上可行,但实际操作中往往不可行,因为很多资源本质上是互斥的,如打印机。

    破坏占有且等待条件:进程在请求资源前必须一次性申请所有需要的资源。若任何一个资源无法立即分配,则进程必须释放所有已占有的资源,稍后重新申请。这会导致资源利用率降低,且可能导致饥饿。

    破坏不可剥夺条件:当进程持有某些资源,并请求其他无法立即分配的资源时,系统可以剥夺该进程已持有的资源,释放以便其他进程使用。这种方法实现起来比较复杂,且可能导致数据丢失或状态不一致。

    破坏环路等待条件:对所有资源进行排序,并要求进程按照递增的顺序请求资源,避免形成环路等待。这是最常用的死锁预防方法之一,例如在数据库系统中,可以对表进行排序,并要求所有事务按照相同的顺序访问表。不过,资源排序看似简单,但实际应用中需要仔细规划和管理,以确保所有进程都遵循相同的规则。

  • 死锁的恢复策略:若死锁已发生,需采取措施打破死锁,使系统恢复正常运行。

    进程终止:最简单的恢复方法是终止一个或多个卷入死锁的进程。可以选择终止所有卷入死锁的进程,但这会导致大量工作丢失;更明智的做法是选择终止那些占用资源较少、优先级较低的进程。

    资源剥夺:从一个或多个卷入死锁的进程中剥夺资源,分配给其他进程。选择剥夺哪些资源需仔细考虑,以尽量减少对进程的影响。资源剥夺可能会导致进程回滚到之前的昌悔状态,需要谨慎处理。进程终止和资源剥夺都是比较激进的恢复方法,可能会导致数据丢失或状态不一致,因此在实际应用中,需根据具体情况选择合适的恢复策略。