螺竹编程
发布于 2024-05-01 / 6 阅读
0

操作系统中的死锁

死锁的原因

死锁是指在并发系统中,多个进程因为相互等待对方释放资源而无法继续执行的状态。死锁的发生主要有两个常见的原因:系统资源不足和进程推进顺序不当。

  1. 系统资源不足:死锁可能发生在系统资源不足时,也称为资源竞争。当多个进程同时请求系统中的有限资源,并且每个进程都持有一部分资源并且等待其他进程释放资源时,就可能发生死锁。例如,两个进程分别持有资源A和资源B,并且每个进程都需要对方持有的资源才能继续执行。如果这两个进程同时请求对方持有的资源,它们就会互相等待对方释放资源,导致死锁的发生。

  2. 进程推进顺序不当:死锁也可能发生在进程推进顺序不当的情况下。当多个进程按照不恰当的顺序请求和释放资源时,就可能发生死锁。这种情况下,死锁的发生并不是因为系统资源不足,而是因为进程之间的相互依赖和顺序导致了循环等待的情况。例如,进程A持有资源X并等待资源Y,而进程B持有资源Y并等待资源X。如果这两个进程的请求和释放资源的顺序不当,就会导致死锁。

死锁是并发系统中的一个严重问题,它会导致系统资源的浪费和进程无法正常执行。为避免死锁的发生,可以采取以下措施:资源分配策略和调度策略的优化,避免资源竞争和循环等待;引入死锁检测和恢复机制,及时检测死锁并采取措施解除死锁;设计合理的资源管理算法,如银行家算法等,确保资源分配的安全性和可靠性。

死锁的4个必要条件

  • 互斥条件:进程对所获得的资源进行排他性使用,任一时刻一个资源仅被一个进程占用。

  • 请求和保持条件:一个进程请求资源得不到满足而阻塞自己时,并不释放已分配给它的资源,该条件也称为部分分配条件。

  • 不可抢占(剥夺)条件:进程锁获得的资源在未使用完毕之前不能被其他进程抢占,而只能由占用该资源的进程自己释放。

  • 循环等待条件:若干进程行成一个循环等待链,链中每个进程都在等待该链中下一个进程所占用的资源。

死锁的预防

预防死锁是为了防止死锁发生或减少死锁发生的可能性。下面介绍三种常用的死锁预防方法:

  1. 破坏"请求和保持"条件:死锁发生的一个条件是进程在持有一些资源的同时继续请求其他资源。为了破坏这个条件,可以采取的措施是要求进程在开始执行时一次性获取所有需要的资源,而不是逐个请求。如果进程无法一次性获取所有资源,则应该释放已经获得的资源,等待一次性获取所需的全部资源。

  2. 破坏"不可抢占"条件:死锁发生的另一个条件是资源不能被抢占,即一旦某个进程获得了资源,其他进程不能强制性地从它那里抢占该资源。为了破坏这个条件,可以引入资源的抢占机制。当其他进程需要某个被占用的资源时,可以抢占该资源并暂时剥夺拥有者的使用权。被剥夺资源的拥有者会被阻塞,直到资源被释放并重新分配给它。

  3. 破坏"循环等待"条件:死锁发生的第三个条件是存在进程之间的循环等待,即每个进程都在等待下一个进程所持有的资源。为了破坏这个条件,可以引入资源的有序分配。通过对资源进行编号或排序,要求进程按照特定的顺序申请资源,从而避免循环等待的发生。另外,也可以引入资源的预先分配策略,使每个进程在开始执行之前就能获得它所需的全部资源。

这些死锁预防方法可以在设计和编程阶段采取,以减少死锁的发生。然而,这些方法可能会带来一定的性能损失或限制资源的可用性。因此,在实际应用中,需要根据具体的系统需求和资源管理策略综合考虑,并选择适合的死锁预防方法。

死锁的避免

死锁的避免是在不改变资源固有性质的前提下,对资源的分配策略施加较少的限制条件来避免死锁的发生。

换言之,死锁的预防需要破坏避免死锁的4个必要条件之一,而死锁的避免则无须可以破坏死锁的4个必要条件,只是对资源的分配策略施加了少许的限制条件来避免死锁的发何时能。

死锁的检测和解除

死锁检测

死锁检测是一种用于检测系统中是否存在死锁的方法。通过死锁检测,可以及时识别出死锁的存在,以便采取相应的措施解除死锁。下面是死锁检测的一般过程:

  1. 构建资源分配图:死锁检测的第一步是构建资源分配图。资源分配图是描述系统中进程和资源之间关系的图形表示。图中的节点表示进程和资源,边表示进程对资源的请求和占有关系。资源分配图可以是有向图或无向图,具体取决于资源的分配关系。

  2. 寻找死锁循环:在资源分配图中,死锁通常表现为一个或多个循环。通过遍历资源分配图,可以寻找是否存在循环路径。如果找到一个循环路径,就意味着存在潜在的死锁。

  3. 确定死锁的类型:在死锁检测过程中,可以进一步确定死锁的类型。常见的死锁类型包括资源死锁和进程死锁。资源死锁是指多个进程互相等待对方所占用的资源,而进程死锁是指多个进程互相等待对方的执行。

  4. 判断死锁的存在:如果存在死锁循环并且无法解除循环,就可以判断系统中存在死锁。死锁检测算法会根据死锁的类型和检测结果给出相应的判断。

  5. 执行死锁恢复措施:一旦确认系统中存在死锁,就需要采取相应的死锁恢复措施。常见的死锁恢复方法包括死锁解除、死锁预防和死锁避免。具体采取哪种措施取决于系统的需求和策略。

需要注意的是,死锁检测算法本身也需要消耗一定的系统资源,因此应该根据系统的实际情况和性能要求来选择合适的检测策略。死锁检测通常用于长时间运行的系统或资源分配频繁的系统,以保证系统的稳定性和可靠性。

死锁定理

根据资源分配图的化简结果,可以判断出该资源分配图对应的系统状态是否为死锁状态。

某一时刻系统状态S为死锁状态的充分条件是当且仅当S状态的资源分配图是不可完全化简的,此充分条件称为死锁定理。

死锁解除

  • 撤销所有死锁进程

  • 让死锁进程回撤到正常执行状态的某个检查点,然后重新启动所有的进程

  • 按照某种顺序逐个撤销死锁进程,知道不再发生死锁为止。

死锁中的代价最小原则

  • 到死锁发现时,消耗的CPU时间最少。

  • 到死锁发现时,获得系统资源的总量最少。

  • 到死锁发现时,产生的输出量最少。

  • 优先级最低。

  • 预计进程的剩余时间最长。