线性化与可序列化

时间:2016-01-27 16:19:20

标签: multithreading concurrency shared-memory consistency

来自this,我理解

  • 线性化和顺序一致性适用于单个对象的单一操作
  • 可串行化和严格的可串行化适用于多个对象的多个操作。

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

  

序列1:

     

T1:   读(X)写(X)

     

T2:   写(X)读(X)

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

  

序列2:

     

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

     

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

这是否也意味着:

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

1 个答案:

答案 0 :(得分:0)

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

更具体地说:

  

对象的顺序规范只是对象的一组连续历史记录

其中历史记录定义为:

  

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

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

  

历史记录中的方法调用H是由H

中的调用和下一个匹配响应组成的对

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

这两个,即单个对象上的单个操作和多个对象上的多个操作,可以通过定义对象(可能统一多个对象)定义适当的顺序规范来实现对等事务被视为某些对象的方法(例如,一个简单的例子是queue enqueue / dequeue [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 Programming on Programming Languages and Systems,Vol。 1990年7月12日第3期。

[3] Software Transactional Memory。 Nir Shavit和Dan Touitou。 DISTRIB。 COMPUT。 (1997)10:99-116。