处理死锁的方法
死锁检测、死锁预防和死锁避免是处理死锁的主要方法。有关这些方法的详细信息如下所示:
死锁检测
资源调度程序在跟踪分配给不同进程的所有资源时,可以检测到死锁。检测到死锁后,可以使用以下方法进行处理:
- 终止所有涉及死锁的进程。这种方法不太实用,因为进程完成的所有进度都会被破坏。
- 可以从某些进程中抢占资源并分配给其他进程,直到解决死锁情况。
死锁预防
在死锁发生之前预防死锁非常重要。因此,系统会在执行每个事务之前检查它,以确保它不会导致死锁。如果即使存在哪怕一点可能性表明某个事务可能导致死锁,则永远不允许它执行。
一些使用时间戳来确保不会发生死锁的死锁预防方案如下所示:
- 等待-死亡方案
在等待-死亡方案中,如果事务 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 完成执行后释放。
死锁避免
最好避免死锁,而不是在死锁发生后采取措施。等待图可用于死锁避免。但是,这仅适用于较小的数据库,因为在较大的数据库中它可能会变得非常复杂。
等待图
等待图显示了资源和事务之间的关系。如果事务请求资源或已持有资源,则在等待图上可见为边。如果等待图包含循环,则系统中可能存在死锁,否则不存在。
鸵鸟算法
鸵鸟算法意味着简单地忽略死锁,并假设它永远不会发生。之所以这样做是因为在某些系统中,处理死锁的成本远高于简单地忽略它,因为它很少发生。因此,只需假设死锁永远不会发生,如果偶然发生,则重新启动系统。
广告