【问题标题】:What is the difference between linearizability and serializability?线性化和串行化有什么区别?
【发布时间】:2011-05-09 22:31:42
【问题描述】:

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

【问题讨论】:

  • 我不能高度推荐 Herlihy 的“多处理器编程艺术”。这很有挑战性,但它正面解决了这个问题,它是开创性的东西,并且伴随着一组很好的 PPT 幻灯片和很棒的 Java 示例代码,这对于具有这种理论深度的书来说是不寻常的。

标签: java concurrency


【解决方案1】:

假设您的分布式系统在 3 台机器(3 个副本)上运行。我们只是想写入和读取键“A”的值。

线性化

在这个模型中,我们的系统将像这样工作 - 一旦 write(A) 完成,我们就可以从三个副本中的任何一个中读取最新值。意思是,一旦一个动作(写/读)完成,它的影响对整个系统的所有未来动作都是可见的(就像一个原子操作)。

在这里,操作顺序无关紧要。所以,在现实中,我们想做读写,但系统可以读写,而且它很好,并且仍然是可线性化的。 Paxos/Raft 算法为多数节点的事务提供了这一点。

可序列化

在此模型中,所有副本(机器)将以相同的顺序处理动作/事件。因此,如果其中一个副本执行写入(A)和读取(A),其他副本将按照相同的顺序执行。

在这里,可以从其他副本获取陈旧数据。假设-replica_1 确实写入(A)。从replica_1 读取(A) 将返回最新值,但如果我们从replica_2 读取,我们可能会得到旧值。唯一的保证是(无时间限制)replica_2 将按相同顺序处理 - 写入然后读取。 Zookeeper 提供了这个。

这是一个了解更多相关信息的好博客 - http://www.bailis.org/blog/linearizability-versus-serializability/

如果我的理解不正确,请告诉我。快乐学习和成长!

【讨论】:

    【解决方案2】:

    两者的主要区别在于 serializability 是一个 global 属性;整个操作/交易历史的属性。 线性化是一个局部属性;单个操作/事务的属性。另一个区别是线性化包括实时的概念,而串行化不包括:操作的线性化点必须位于其调用和响应时间之间。 (请参阅 Tim Harris:Transactional Memory, 2ed。有关示例和证明,请参阅 Herlihy 的幻灯片,来自 The Art of Multiprocessor Programming,关于线性化的部分available here .

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

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

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

    参考资料:

    更多详情:

    如果您真的关心这一点,请阅读介绍定义的论文。对于线性化,这是Linearizability: A Correctness Condition for Concurrent Objects, Herlihy and Wing。它很密集,但值得关注。请注意,在软件事务内存社区中,线性化是否是正确的目标/属性是一个悬而未决的问题。

    可序列化是关于操作集合的结果/“系统”可以表达为所有操作。线性化是系统中单个操作子集的属性......如果一个操作/一组操作在其他操作看来好像它们相对于其他操作发生在(逻辑)时间的特定时刻,那么它们就是可线性化的。这里的规范论文是Papadimitriou, The Serializability of Concurrent Database Updates

    当您考虑“可线性化”时,请考虑“原子操作”。当(似乎)相对于系统的其他部分原子地发生时,(一组)操作是可线性化的。一个常见的表述是“提供每个操作在其调用和响应之间立即生效的错觉”。 linearizability的公式是由于Herlihy,它强调这是一个局部属性,而其他类型的顺序一致性属性如“serializability”是全局的。

    【讨论】:

    • 非常感谢 Anderson 的精彩解释和资源链接。我从这些幻灯片中得到了线性化的窍门。
    • @iJeeves:很高兴。我们现在使用 Herlihy 的书(以及其中的一些幻灯片)教授并发课程,这是一次很棒的体验。
    • 这些幻灯片现在被登录页面屏蔽了。
    • 非常有帮助的答案。
    【解决方案3】:

    理解这一点的一个好方法是从数据库的角度来看待这个问题。 (我知道你要的是 java 的上下文,抱歉)

    假设,您是一个数据库。您同时接受在同一对象上操作的多个事务,但您只有一个磁盘臂

    当您同时收到多个事务时,您将不得不以某种方式在事务中重新排序这些操作,以便您可怜的磁盘臂可以一个接一个地处理它们。

    可序列化

    您可以重新安排这些交易,使其看起来像是按顺序发生的(一个接一个)。 正如您可以想象的那样,如果您接受任意交易(例如,过去 10 年的一笔不良交易),这并不总是可能的。 所以很自然,你强制执行一些限制或冲突预防机制,然后你可以说“我是可序列化的!:)”。

    线性化

    您不仅需要做serialization 需要您做的事情。您还可以仔细查看这些交易。并且非常努力地以顺序方式重新安排这些事务,而不会破坏事务的语义顺序。您可能已经注意到,semantic order 是关键。 基本上,为了声称你是linearizable,你必须为每笔交易假设/找到一个linearization point,然后根据linearization point对它们进行排序。

    因此,通用 RDMS 数据库很少使用 Hey I'm linearizable!。 但是,如果您是 Key-Value 数据库,这并不少见。

    例如作为 KV 数据库,你可以说“我是linearizable!”如果您可以确保read 将始终获得最新的可能写入。 (假设read操作发送响应的时刻是linearization point) 这听起来微不足道,但如果您是分布式 KV 数据库,这将是一个重大挑战。 另请注意,serializability 不要求您提供相同的保证。

    【讨论】:

      【解决方案4】:

      这里有 Peter Bailis 的精彩解释:

      “用简单的英语,在 linearizability 下,写入应该是瞬时的。不精确的是,一旦写入完成,所有后续读取(其中“稍后”由挂钟开始时间定义)应该返回该写入的值或稍后写入的值。一旦读取返回特定值,所有后续读取都应返回该值或稍后写入的值。"

      "Serializability 是对事务或对一个或多个对象的一个​​或多个操作组的保证。它保证一组事务(通常包含读取和写入操作)的执行超过多个项目相当于事务的一些串行执行(总排序)。”

      【讨论】:

        【解决方案5】:

        请参阅@andersoj 的答案,以清楚地描述可串行化和可线性化之间的区别。

        这仅与 Java 并发编程间接相关。通常,并发 Java 程序不需要具有可序列化或可线性化的历史。在这种情况下,对于程序(Java 或其他)而言,可串行化通常足以“正确”,尽管特定问题可能需要更强的线性化属性。但无论哪种方式,决定正确性要求的是问题,而不是Java。

        【讨论】:

        • 同意,+1。 Java 在这里很有趣,因为有很多关于 Java 内存模型等的讨论和强调……但这里的问题与必须映射到处理器、语言和特定应用程序要求的正式理解有关。 (大多数人大部分时间都不会想到这一点。)
        【解决方案6】:

        查看维基百科的解释:

        http://en.wikipedia.org/wiki/Linearizability#Linearizability_versus_serializability

        这也可能有点令人困惑,因为我们还使用术语序列化来指代将类转换为数据流以进行存储或网络传输。

        【讨论】:

        猜你喜欢
        • 2011-07-16
        • 1970-01-01
        • 2012-03-19
        • 2011-01-20
        • 2013-01-13
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多