“ABD 把原子寄存器实现在异步消息传递系统上。本页先完整说明原始单写多读(SWMR)的无界版本号方案,再在相同故障模型下构造多写多读(MWMR)扩展。”
形式陈述 ​
一个写操作正在进行时,读操作究竟可以读出什么?本页固定单写多读寄存器:值域为 write(v),任意读进程调用 read()。每个进程的历史良构,即上一次调用返回后才能发起下一次调用;因而各次写不重叠。设初始化写入
以下三种规格都要求:不与任何写重叠的读,返回它开始之前最近完成的写值;若此前没有普通写,就返回
| 规格 | 与写重叠的读允许怎样返回 |
|---|---|
| Safe | 可返回值域 |
| Regular | 只能返回该读开始前最近完成的写值,或某次与该读重叠的写所写入的值。 |
| Atomic | 全体读写必须共同满足寄存器顺序规格的线性一致性:存在保留实时顺序的单一合法排列。 |
寄存器的顺序规格是:写替换当前值,读返回当前值。Atomic 要求线性一致性,因而不只是“每个读分别挑一个合理值”,还要求这些选择能同时放进一条时间线。对含未返回写的历史,按线性一致性的 completion 规则补全或删除 pending 操作;不能因写者暂停就一概忽略已被读到的写。
在这些相同模型条件下,atomic 蕴含 regular,regular 蕴含 safe。第一项来自合法顺序中的最近前驱写:它不能是读结束之后才开始的写,也不能是已被读开始前另一已完成写覆盖的旧写。第二项直接来自允许返回值集合的包含关系。逆向蕴含均不成立。
直觉
Safe 只保护没有写者干扰的读。Regular 进一步要求干扰期间读到的也是“这次变化附近”真正写入的值,却没有协调两个读者对变化发生位置的判断。Atomic 则要求大家对同一次写何时生效能达成一致解释。
这里的 atomic 描述外部历史,不要求一条机器指令完成操作。反过来,把值存进某种机器字也不足以省去语言内存模型与访问协议的前提。三种寄存器规格回答的是可观察读值问题,均不自带终止或公平保证。
例子与边界
同一次写中的新旧倒退 ​
取
若结果为
若改成某个重叠读返回
二值域也不能抹掉区别 ​
值域只有 write(0),重叠读仍可按 safe 返回
这些定义不能未经说明地扩展到多写者:写操作自身也会重叠,“最近的写”不再由单写者次序直接给出。讨论多写者 regular 变体时,需要重新规定历史和写的排序规则。多写多读的 atomic 则可以直接使用同一个顺序寄存器规格:在保留实时先后的合法排列中,每次写替换当前值,每次读返回最近前驱写的值;并发写在排列中仍逐个出现。因而扩展的是可调用写的进程集合,并非读返回值的类型,也不是让一个读返回所有并发写值。ABD 的 MWMR 扩展用写前查询生成二元标签,再构造这种全历史顺序;本页的 safe、regular 分类仍采用前述单写模型。
推论与应用
设计共享内存系统时,应先写明基础寄存器处于哪一级,再证明上层算法。以原子读为依据的版本验证,不能直接在 safe 读上运行并沿用原证明;重叠读可能凭空产生一个版本号。
即使每个槽都是 atomic,也不能把逐槽读取自动当作原子快照。单槽历史各自合法,与整个数组能在一个瞬间被读取,是两项不同承诺。进展则另由wait-free等条件描述:安全规格再强,也不排除某个操作永不返回。
ABD 寄存器在异步消息传递中实现这里的单写多读 atomic 规格:多数写确认保护写后读,读者返回前的多数写回进一步排除上述新旧倒退。它说明 atomic 是可由多轮消息实现的外部承诺,不要求共享的原子机器字。
自测:保留上例时间区间,列出二元结果
参考资料
- Leslie Lamport, “On Interprocess Communication”, DEC SRC Research Report 8, 1985;分两部分发表于 Distributed Computing 1, 1986。Part II “Algorithms”,§4(报告印刷页 19–21,Figure 5)给出寄存器分类;§5 Construction 3 处理 safe 二值寄存器的重复写问题。
- Maurice P. Herlihy and Jeannette M. Wing, “Linearizability: A Correctness Condition for Concurrent Objects,” ACM Transactions on Programming Languages and Systems 12(3), 1990, pp. 463–492,§§2–3。