线性化和序列化有什么区别?

2022-08-31 12:29:04

线性化和可序列化性(在Java的上下文中)有什么区别?您能用一个例子来解释它们之间的区别,或者提供一个很好的参考吗?


答案 1

两者之间的核心区别在于可序列化性是一个全局属性。整个操作/事务历史记录的属性。线性化性是一个局部属性;单个操作/事务的属性。另一个区别是线性化包括实时的概念,而序列化性则不然:操作的线性化点必须位于其调用和响应时间之间。(参见Tim Harris: Transactional Memory, 2ed。有关一些示例和证明,请参阅Herlihy的幻灯片,该幻灯片来自“多处理器编程的艺术”,其中线性化性部分可在此处获得

这两个属性都针对同一个目标:顺序一致性。摘自Herlihy的论文:

数据库和分布式系统上的许多工作都使用可序列化性作为并发计算的基本正确性条件。在此模型中,事务是一个控制线程,它将有限基元操作序列应用于与其他事务共享的一组对象。如果历史记录等效于事务似乎按顺序执行的历史记录,即没有交错,则历史记录是可序列化的。可以以明显的方式在非重叠的事务对上定义(部分)优先顺序。如果事务在顺序历史记录中的顺序与其优先顺序兼容,则历史记录是严格可序列化的...

...线性化性可以看作是严格序列化的特殊情况,其中事务被限制为由应用于单个对象的单个操作组成。然而,这种单一操作限制具有深远的实际和形式化后果,使线性化计算与可序列化计算具有不同的风格。一个直接的实际结果是,适用于可序列化的并发控制机制通常不适合线性化,因为它们引入了不必要的开销,并对并发性施加了不必要的限制。

引用:

更多详情:

如果你真的关心这一点,请阅读介绍定义的论文。对于线性化性,这就是线性可性:并发对象,Herlihy和Wing的正确性条件。它很密集,但值得关注。请注意,在软件事务性内存社区中,线性化性是否是正确的目标/属性是一个悬而未决的问题。

可序列化性是关于操作集合的结果/“系统”可表示为所有操作的特定排序(“好像执行以特定顺序进行......”)。线性化是系统中单个操作子集的属性...如果一个操作/一组操作对其他操作来说似乎是在(逻辑)时间的特定时刻相对于其他操作发生的,则它们是可线性化的。这里的规范论文是Papadimitriou,并发数据库更新的可序列化性

当你考虑“线性化”时,想想“原子操作”。当一(一组)操作(看起来)相对于系统的其他部分以原子方式发生时,它们是可线性化的。一个常见的表述是“提供一种错觉,即每个操作在其调用和响应之间立即生效。线性化的公式是由于Herlihy,它强调这是一个局部属性,而不是其他类型的顺序一致性属性,如全局的“序列化性”。


答案 2

Peter Bailis在这里有一个很好的解释:

“在简单的英语中,在线性化的情况下,写作应该是即时的。不准确地说,一旦写入完成,所有后续读取(其中“later”由挂钟开始时间定义)都应返回该写入的值或以后写入的值。一旦读取返回特定值,所有以后的读取都应返回该值或稍后写入的值。

"可序列化性是对事务或对一个或多个对象的一个或多个操作的组的保证。它保证在多个项目上执行一组事务(通常包含读取和写入操作)等效于事务的某些串行执行(总排序)。


推荐