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