“SC for DRF 不是脱离语言后仍成立的一条无条件定理,而是一族由内存模型参数化的保证。设模型 $M$ 规定普通访问、原子访问、同步操作及 happens before 的生成规则。常见…”
形式陈述 ​
本页专指 Lamport 的共享内存顺序一致性,它是内存一致性模型的一种。设执行的内存操作集合为
并且每次读
定义只保留每线程程序顺序。若一个线程的操作已经响应、另一线程之后才发起操作,跨线程的这段实时先后仍不必进入
直觉
SC 允许把并发执行解释成某一种合法交错。每个线程都看见自己的指令按程序次序发生,所有线程还必须共享同一解释;自由度只在不同线程操作如何穿插。它比“各地址各有一个写序”更强,因为跨地址读值也必须同时嵌入同一个全序。
这个心智模型不携带墙上时钟。不同线程的两个非重叠操作仍可在见证全序中反向排列,只要各自线程内没有约束被破坏。
例子与边界
初值
形成严格全序中的环,故该结果不可能是 SC。
这个例子还展示 SC 不具对象局部可组合性。单看寄存器
另一方面,若客户端 write(1) 已经返回,客户端 read() 却读到旧值
“所有处理器最终看到相同值”只是收敛性,不等同于存在统一操作序。SC 也只是一项安全约束,不承诺某次读写最终执行、锁不会饥饿或副本在故障后仍可用。
推论与应用
SC 是弱内存研究的基准,却不是现代语言与硬件的默认行为。特定语言的 SC-for-DRF 保证只在程序消除模型所定义的数据竞争,并正确使用同步与原子内存序时,才把相应观察映射回某类 SC 交错。
对同一个顺序对象规格,任何线性一致历史都能提供一个保程序顺序的 SC 见证,反向不成立。这个子类关系不抹平抽象层:SC 常约束内存操作集合,线性一致性常约束调用—响应区间。应用结论前仍要确认两者排列的是同一批操作。
验证工具可从程序的执行轨迹提取内存事件,再由模型检查寻找无法嵌入任何保程序序全序的反例。工具探索哪些 interleaving 取决于语言和硬件模型;SC 的定义本身并不保证实现允许所有交错,也不保证只允许 SC 交错。
参考资料
- Leslie Lamport, “How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs,” IEEE Transactions on Computers C-28(9), 1979, pp. 690–691,Full paper。
- Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Ch. 3。