2021-11-13 13:59:37
死锁是进程间因资源竞争陷入无限等待的状态,即两个或多个进程无限期地相互等待对方释放资源,导致所有进程都无法继续执行。以下从死锁的产生条件、检测方法、避免策略和恢复策略展开介绍:
互斥:资源一次只能由一个进程占用,如打印机等独占设备。
占有且等待:进程持有至少一个资源,同时等待获取其他被占用的资源。
不可剥夺:已分配给进程的资源,在该进程未主动释放前,其他进程无法强行夺取。
环路等待:存在一个进程的循环链,链中每个进程都在等待下一个进程所占用的资源。
资源分配图结合DFS检测环路:资源分配图是有向图,节点代表进程和资源,边代表进程请求或持有资源。若图中存在环路,则可能存在死锁,可使用深度优先搜索(DFS)算法检测环路。
银行家算法:该算法能检测并避免死锁,需维护系统中资源耐茄正分配和请求的详细信息,计算复杂度较高,但可提供可靠的死锁检测。不过,许多操作系统和数据库系统并不总是主动检测死锁,而是选择在发生超时或资源请求失败时才进行处理,这种策略称为死锁纳高避免或死锁忽略。
破坏互斥条件:理论上可行,但实际操作中往往不可行,因为很多资源本质上是互斥的,如打印机。
破坏占有且等待条件:进程在请求资源前必须一次性申请所有需要的资源。若任何一个资源无法立即分配,则进程必须释放所有已占有的资源,稍后重新申请。这会导致资源利用率降低,且可能导致饥饿。
破坏不可剥夺条件:当进程持有某些资源,并请求其他无法立即分配的资源时,系统可以剥夺该进程已持有的资源,释放以便其他进程使用。这种方法实现起来比较复杂,且可能导致数据丢失或状态不一致。
破坏环路等待条件:对所有资源进行排序,并要求进程按照递增的顺序请求资源,避免形成环路等待。这是最常用的死锁预防方法之一,例如在数据库系统中,可以对表进行排序,并要求所有事务按照相同的顺序访问表。不过,资源排序看似简单,但实际应用中需要仔细规划和管理,以确保所有进程都遵循相同的规则。
进程终止:最简单的恢复方法是终止一个或多个卷入死锁的进程。可以选择终止所有卷入死锁的进程,但这会导致大量工作丢失;更明智的做法是选择终止那些占用资源较少、优先级较低的进程。
资源剥夺:从一个或多个卷入死锁的进程中剥夺资源,分配给其他进程。选择剥夺哪些资源需仔细考虑,以尽量减少对进程的影响。资源剥夺可能会导致进程回滚到之前的昌悔状态,需要谨慎处理。进程终止和资源剥夺都是比较激进的恢复方法,可能会导致数据丢失或状态不一致,因此在实际应用中,需根据具体情况选择合适的恢复策略。