“读改写原语原子地读取位置旧值,依据旧值计算并写回新值,同时返回旧值或成功标志。典型实例包括 test and set、fetch and add、swap 和 compare and swa…”
形式陈述 ​
固定异步共享内存模型:进程可能崩溃停止,正确进程持续取得步骤;实现可使用任意多个原子读写寄存器和某种线性一致的对象类型
这里分类的是对象类型及其完整顺序规格,不是某一个容量有限、随后耗尽的实例。算法可以创建任意多个
Herlihy 层级的经典分类包括:原子读写寄存器的共识数为
通用构造的核心是把并发操作转化为一串待决定的状态机步骤。各进程提出下一项操作,利用第
直觉 ​
共识要求多个进程从不同提议中不可撤销地选出同一个值,因此能测量原语“打破对称”的能力。普通读写让每个进程留下信息,却没有一个原子时刻能让竞争者共同认定谁先;CAS 则把“若仍无人决定,就由我写入”压成一次不可分割的条件更新,首个成功者自然成为共同选择。
层级的价值在于把无数实现问题缩成一次比较。若目标类型能解决三进程共识,而手头原语最多只能解决两进程共识,就无需继续寻找 wait-free 实现;不可能性已经来自组合论证。这个结论并不禁止锁实现或较弱进展实现,只精确排除指定模型中的 wait-free 路线。
例子与边界 ​
用 CAS 为任意有限数量进程解决一次共识:共享原子槽 decision 初值为 CAS(decision, ⊥, v_i),随后读取并决定槽中的值。只有一个 CAS 能把
只用原子读写寄存器不能为两个进程 wait-free 解共识。直觉上,在双方仍可能决定不同值的临界配置中,两个进程各自下一步若作用于不同寄存器便可交换次序,若是对同一寄存器的普通读写又有一步会覆盖或无法被另一方区分;由此可构造两个不可区分执行,迫使协议同时保留两种决定可能。正式证明使用 valency,而不是以“读写不够快”作经验判断。
有限位宽、可能回绕的机器 CAS 是否保持抽象类型的全部能力,要看对象规格与可用内存模型。硬件吞吐、缓存争用和 ABA 风险影响实现性能与安全证明,却不改变理想原子 CAS 类型的经典共识数;若接口改成可能伪失败、只比较受限状态或允许非线性行为,就必须重新分类。
推论与应用 ​
共识层级解释了读改写原语之间并非只有性能差异。它为无锁数据结构给出选择下界,也说明为什么从弱原语实现强对象时,算法常不得不降低进展保证、限制参与者数量或引入更强硬件操作。
分类结论不能反向代替具体算法证明。一个原语共识数足够高,只表示存在通用 wait-free 构造;实际队列或栈仍需证明线性一致性、步骤界和内存回收。相反,某对象无法用低层原语 wait-free 实现,也不排除使用互斥锁、随机化或特定调度假设得到可用实现。
参考资料
- Maurice Herlihy, “Wait-Free Synchronization,” ACM TOPLAS 13(1), 1991, pp. 124–149。
- Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Ch. 5。
- Hagit Attiya and Jennifer Welch, Distributed Computing: Fundamentals, Simulations, and Advanced Topics, 2nd ed., Wiley, 2004,共享内存可解性相关章节。