处理死锁的方法


死锁检测、死锁预防和死锁避免是处理死锁的主要方法。有关这些方法的详细信息如下所示:

死锁检测

资源调度程序在跟踪分配给不同进程的所有资源时,可以检测到死锁。检测到死锁后,可以使用以下方法进行处理:

  • 终止所有涉及死锁的进程。这种方法不太实用,因为进程完成的所有进度都会被破坏。
  • 可以从某些进程中抢占资源并分配给其他进程,直到解决死锁情况。

死锁预防

在死锁发生之前预防死锁非常重要。因此,系统会在执行每个事务之前检查它,以确保它不会导致死锁。如果即使存在哪怕一点可能性表明某个事务可能导致死锁,则永远不允许它执行。

一些使用时间戳来确保不会发生死锁的死锁预防方案如下所示:

  • 等待-死亡方案
  • 在等待-死亡方案中,如果事务 T1 请求由事务 T2 持有的资源,则可能发生以下两种情况之一:

    • TS(T1) < TS(T2) - 如果 T1 比 T2 旧,即 T1 比 T2 更早进入系统,则允许它等待资源,该资源将在 T2 完成执行后释放。
    • TS(T1) > TS(T2) - 如果 T1 比 T2 新,即 T1 在 T2 之后进入系统,则 T1 将被终止。稍后将使用相同的时间戳重新启动它。
  • 击杀-等待方案
  • 在击杀-等待方案中,如果事务 T1 请求由事务 T2 持有的资源,则可能发生以下两种情况之一:

    • TS(T1) < TS(T2) - 如果 T1 比 T2 旧,即 T1 比 T2 更早进入系统,则允许它回滚 T2 或击杀 T2。然后 T1 获取资源并完成执行。T2 稍后将使用相同的时间戳重新启动。
    • TS(T1) > TS(T2) - 如果 T1 比 T2 新,即 T1 在 T2 之后进入系统,则允许它等待资源,该资源将在 T2 完成执行后释放。

死锁避免

最好避免死锁,而不是在死锁发生后采取措施。等待图可用于死锁避免。但是,这仅适用于较小的数据库,因为在较大的数据库中它可能会变得非常复杂。

等待图

等待图显示了资源和事务之间的关系。如果事务请求资源或已持有资源,则在等待图上可见为边。如果等待图包含循环,则系统中可能存在死锁,否则不存在。

Wait for graph

鸵鸟算法

鸵鸟算法意味着简单地忽略死锁,并假设它永远不会发生。之所以这样做是因为在某些系统中,处理死锁的成本远高于简单地忽略它,因为它很少发生。因此,只需假设死锁永远不会发生,如果偶然发生,则重新启动系统。

更新于: 2020年6月24日

13K+ 浏览量

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告