Skip to content

定义Definition

Safe、Regular 与 Atomic 寄存器

Safe register · Regular register · Atomic register · 安全寄存器 · 规则寄存器 · 原子寄存器

以重叠读写的允许返回值和跨操作排序约束区分单写寄存器的三种一致性规格。

形式陈述 ​

一个写操作正在进行时,读操作究竟可以读出什么?本页固定单写多读寄存器:值域为 V,一个指定进程调用 write(v),任意读进程调用 read()。每个进程的历史良构,即上一次调用返回后才能发起下一次调用;因而各次写不重叠。设初始化写入 v0 已在所有普通操作前完成。两操作重叠,指双方都没有在另一方调用前返回。

以下三种规格都要求:不与任何写重叠的读,返回它开始之前最近完成的写值;若此前没有普通写,就返回 v0。区别在于存在重叠时的保证。

规格 与写重叠的读允许怎样返回
Safe 可返回值域 V 中任意值,包括从未写入过的值。
Regular 只能返回该读开始前最近完成的写值,或某次与该读重叠的写所写入的值。
Atomic 全体读写必须共同满足寄存器顺序规格的线性一致性:存在保留实时顺序的单一合法排列。

寄存器的顺序规格是:写替换当前值,读返回当前值。Atomic 要求线性一致性,因而不只是“每个读分别挑一个合理值”,还要求这些选择能同时放进一条时间线。对含未返回写的历史,按线性一致性的 completion 规则补全或删除 pending 操作;不能因写者暂停就一概忽略已被读到的写。

在这些相同模型条件下,atomic 蕴含 regular,regular 蕴含 safe。第一项来自合法顺序中的最近前驱写:它不能是读结束之后才开始的写,也不能是已被读开始前另一已完成写覆盖的旧写。第二项直接来自允许返回值集合的包含关系。逆向蕴含均不成立。

直觉

Safe 只保护没有写者干扰的读。Regular 进一步要求干扰期间读到的也是“这次变化附近”真正写入的值,却没有协调两个读者对变化发生位置的判断。Atomic 则要求大家对同一次写何时生效能达成一致解释。

这里的 atomic 描述外部历史,不要求一条机器指令完成操作。反过来,把值存进某种机器字也不足以省去语言内存模型与访问协议的前提。三种寄存器规格回答的是可观察读值问题,均不自带终止或公平保证。

例子与边界

同一次写中的新旧倒退 ​

取 V={0,1,2},初值 0。写者启动长操作 W=write(1);在它返回前,读者先完成 R1,再调用并完成 R2。两次读都与 W 重叠,但 R1 与 R2 不重叠。

初值为零,写入一的操作覆盖两个互不重叠的读;读值一、零分别符合 regular,却无法共同线性化。

若结果为 (R1,R2)=(1,0),每个读都满足 regular:1 来自重叠写,0 是先前值。但 R1=1 迫使 W<R1,实时顺序迫使 R1<R2,而 R2=0 又迫使 R2<W。三条约束成环,所以不存在 atomic 解释。这个现象称新旧倒退;即使两个读来自不同读者,实时先后约束仍然有效。

若改成某个重叠读返回 2,它仍符合 safe,因为 2∈V;却不 regular,因为最近旧值与唯一重叠写值只有 0,1。若两读返回 (0,1),则可排列为 R1<W<R2;(0,0) 可把写放在两读之后,(1,1) 可把写放在两读之前。这些都是合法 atomic 历史。

二值域也不能抹掉区别 ​

值域只有 {0,1} 时,从 0 写到 1 的一次重叠读必然返回旧值或新值。然而,这不能证明所有 safe 二值寄存器都是 regular:初值为 0,写者再次执行 write(0),重叠读仍可按 safe 返回 1。Regular 在此只允许 0。Lamport 的二值构造让写者在私有状态中记住上次值,只在值改变时实际访问底层 safe 寄存器,正是为了排除这个重复写边界。

这些定义不能未经说明地扩展到多写者:写操作自身也会重叠,“最近的写”不再由单写者次序直接给出。讨论多写者 regular 变体时,需要重新规定历史和写的排序规则。多写多读的 atomic 则可以直接使用同一个顺序寄存器规格:在保留实时先后的合法排列中,每次写替换当前值,每次读返回最近前驱写的值;并发写在排列中仍逐个出现。因而扩展的是可调用写的进程集合,并非读返回值的类型,也不是让一个读返回所有并发写值。ABD 的 MWMR 扩展用写前查询生成二元标签,再构造这种全历史顺序;本页的 safe、regular 分类仍采用前述单写模型。

推论与应用

设计共享内存系统时,应先写明基础寄存器处于哪一级,再证明上层算法。以原子读为依据的版本验证,不能直接在 safe 读上运行并沿用原证明;重叠读可能凭空产生一个版本号。

即使每个槽都是 atomic,也不能把逐槽读取自动当作原子快照。单槽历史各自合法,与整个数组能在一个瞬间被读取,是两项不同承诺。进展则另由wait-free等条件描述:安全规格再强,也不排除某个操作永不返回。

ABD 寄存器在异步消息传递中实现这里的单写多读 atomic 规格:多数写确认保护写后读,读者返回前的多数写回进一步排除上述新旧倒退。它说明 atomic 是可由多轮消息实现的外部承诺,不要求共享的原子机器字。

自测:保留上例时间区间,列出二元结果 {0,1}2 中哪些可线性化,并说明若把 R2 移至 W 返回之后,哪些结果还合法。检查标准:原来仅 (1,0) 不 atomic;移动后第二读必须为 1,只剩 (0,1) 与 (1,1),这个限制连 safe 也必须遵守。

参考资料
  • 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。
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系