【问题标题】:Linearizability vs. Serializability线性化与串行化
【发布时间】:2016-01-27 16:19:20
【问题描述】:

来自this,我明白了

  • 线性化和顺序一致性适用于单个对象的单个操作
  • Serializability 和 Strict Serializability 适用于对多个对象的多个操作。

对单个对象的单个操作是否意味着以下?

序列 1:

T1: 读(X) 写(X)

T2: 写(X) 读(X)

而多个操作和多个对象意味着:

序列 2:

T1: 读(Y) 写(X) 读(Y)

T2: 写(Y) 读(X) 写(Y)

这是否也意味着:

  1. 序列 2 可以推断函数(或 java 中的方法)的执行?
  2. 序列 1 只能推理函数内同一对象上的操作子集?

【问题讨论】:

    标签: multithreading concurrency shared-memory consistency


    【解决方案1】:

    首先,请注意一致的历史——根据给定的一致性模型,例如线性化或可串行化——被定义为满足对象的顺序规范的那些操作点(或方法)调用 [1, 2]。

    更具体地说:

    对象的顺序规范只是对象的一组顺序历史

    其中历史定义为:

    方法调用和响应事件的有限序列

    其中一对调用和响应事件形成一个方法调用,即:

    历史 H 中的方法调用是一对由调用和 H 中的下一个匹配响应组成的对

    因此,实际上,线性化是为单个对象上的单个操作定义的,但该定义也可以涵盖多个对象的历史记录 [1, 2]。另一方面,可序列化本质上涵盖了对多个对象的多个操作的历史,因为它(通常)是在事务处理的上下文中定义的,其中每个事务可以涉及对多个对象的多个操作。

    这两者,即对单个对象的单个操作和对多个对象的多个操作,可以通过定义对象上的方法(可能统一多个对象)来等效,这些方法定义了适当的顺序规范,其中整个事务被视为某些对象上的方法(例如,一个简单的例子是队列入队/出队 [1])。这反过来又定义了此类对象的顺序规范,从而根据给定的一致性模型定义了有效的历史记录。

    现在,如果将 T1 和 T2 解释为线程,那么实际上,序列 1 调用单个对象的操作,而序列 2 显然调用多个操作和多个对象。请注意,在这两种情况下,都可以根据线性化和可串行化来检查历史记录,而读取和写入操作可能会被分组为“语义上”的原子方法,如前所述。

    根据线性化和可序列化之间的关系,可序列化是严格的弱一致性模型,其中有效历史可能等同于以任意顺序执行方法,而线性化可以被视为等同于严格的可序列化(如果我们将事务视为单个对象)。请注意,一些作者开始在事务 [3] 的上下文中使用线性化。


    [1]The Art of Multiprocessor Programming。作者:Nir Shavit 和 M P. Herlihy

    [2]Linearizability: A Correctness Condition for Concurrent Objects。通过 M P. Herlihy 和 J M. Wing。 ACM 编程语言和系统交易,卷。 12,第 3 期,1990 年 7 月。

    [3]Software Transactional Memory。由 Nir ​​Shavit 和 Dan Touitou 撰写。分销。计算。 (1997) 10: 99-116。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2022-07-13
      • 2020-08-27
      • 2018-12-09
      • 2011-07-16
      • 2018-01-27
      • 2013-04-20
      • 2021-01-04
      • 1970-01-01
      相关资源
      最近更新 更多