等待芯片和伤口等待算法有什么区别?

似乎这两种死锁预防技术都在做同样的事情:回滚旧进程。

两者有什么区别?

请提供一个合适的例子来对比这两种算法。

答案

等待死亡计划

它是一个non-preemptive 预防死锁的技术。~n~请求 T 当前持有的数据项~k~, T~n~仅当时间戳小于 T 时才允许等待~k~(即T~n~是较老的 比 T~k~),否则T~n~被杀(“死”)。

在此方案中,如果一个事务请求锁定一个资源(数据项),而该资源已被另一个事务以冲突锁持有,则可能会发生以下两种可能性之一:

  1. Timestamp(T~n~) < Timestamp(T~k~ ) − 即 T~n~,正在请求冲突锁,是较老的 比 T~k~− 然后 T~n~允许"等待"直到数据项可用。

  2. Timestamp(T~n~) > Timestamp(T~k~) − 即 T~n~是更年轻 比 T~k~− 然后 T~n~被杀死(“死亡”)。时间~n~稍后以随机延迟重新启动,但具有相同的时间戳(n)。

该方案允许较旧的事务"等待",但杀死较新的事务(“死亡”)。

例子

假设交易T~5~, T~10~, T~15~分别具有时间戳 5、10 和 15。

如果T~5~请求 T 持有的数据项~10~然后T~5~将等待"。

如果T~15~请求 T 持有的数据项~10~,则 T~15~将被杀死(“死”)。

伤口等待计划

它是一个preemptive 预防死锁的技术。~n~请求 T 当前持有的数据项~k~, T~n~仅当时间戳大于 T 时才允许等待~k~,否则T~k~被杀死(即 T~k~被T打伤~n~)。

在此方案中,如果一个事务请求锁定一个资源(数据项),而该资源已被另一个事务以冲突锁持有,则可能会发生以下两种可能性之一:

  1. Timestamp(T~n~) < Timestamp(T~k~) ,则 T~n~力 T~k~被杀 - 即 T~n~“伤口"T~k~。时间~k~稍后以随机延迟重新启动,但具有相同的时间戳(k)。

  2. Timestamp(T~n~) > Timestamp(T~k~) ,则 T~n~被迫"等待"直到资源可用。

如果较旧的事务已持有锁,则此方案允许较新的事务请求锁"等待”,但如果较旧的事务请求较新的事务已持有的项目上的锁定,则强制较新的事务挂起(“受伤”)

例子

再次假设交易 T~5~, T~10~, T~15~分别具有时间戳 5、10 和 15。

如果T~5~请求 T 持有的数据项~10~,那么数据项将从T中被抢占~10~和T~10~将被暂停。

如果T~15~请求 T 持有的数据项~10~,则 T~15~将等待"。

概括

在这两种情况下,只有在某个时间进入系统的交易之后时间戳(即较新的事务)可能会被终止并重新启动。

来自: stackoverflow.com