“状态式证明通常扩充 pending operation ghost state,并维护具体表示与抽象对象状态的关系。调用登记参数和未完成操作;普通内部步保持抽象状态不变;选定的线性化步骤执行…”
形式陈述 ​
设并发实现为
点态量词是
方向与现有 系统精化关系 一致:实现不能增加规格禁止的可观察行为,但可以消除内部非确定选择。它不要求每条抽象行为都由实现实现。行为究竟取有限前缀、最大有限执行还是公平无限执行,必须在 轨迹与路径语义 中固定;改变这一选择会改变精化命题。
状态模拟是证明上述包含的充分工具。关系把具体状态关联到抽象状态,每个具体步由抽象步或允许的停顿匹配,调用与返回投影一致。模拟不是定义本身,也未必在没有辅助状态或反向推理时完备。
直觉
精化不是比较两份代码“看起来是否相似”,而是给观察者设一场辨认测试。若任何许可客户看到实现产生的一段行为,都能在规格世界找到相同观察,那么客户不能用契约允许的手段证明实现越界。内部多走几步、改变表示或固定某个合法选择都可以被隐藏。
客户集合和观察接口不可省略。锁内暂时破坏的数据关系,对只能经锁访问的客户可能完全不可见;同一实现面对能无锁读取内部字段的监控线程却可能泄露中间状态。所谓“实现精化规格”总是相对于谁能看、能看见什么以及调度允许什么。
例子与边界
抽象对象提供原子 swap(x,y),从状态
t := x
x := y
y := t
内部状态轨迹经过
若加入一个不取锁的 metrics 线程,它可能在两次写之间读到
只比较有限安全前缀还可能容忍无限内部循环:每个已经产生的可见前缀都合法,实现却永不返回。要保存终止、无饥饿或公平活性,需采用 divergence-sensitive 行为和对应调度假设。弱内存下,编译器与硬件还可能暴露顺序语义中不存在的读写观察,除非精化模型明确包含内存排序。
推论与应用
线性一致性可把并发对象的每段历史匹配到尊重实时顺序的原子顺序规格,因此在合适客户和内存模型下提供强有力的对象精化原则。它仍只约束安全历史;从线性一致性自动推出 contextual refinement 往往还需要客户数据竞争自由、调用接口封装和异常语义等条件。
并发精化支持逐层开发:无锁实现精化原子对象,原子对象再精化业务规格;每层隐藏不同内部事件。传递性要求各层观察字母表和发散约定兼容。若中间层把一个上层可见失败悄悄隐藏,简单套用集合包含并不能得到端到端结论。
参考资料
- Maurice P. Herlihy and Jeannette M. Wing, “Linearizability: A Correctness Condition for Concurrent Objects,” ACM TOPLAS 12(3), 1990, pp. 463–492。
- Ivana Filipović, Peter O’Hearn, Noam Rinetzky, and Hongseok Yang, “Abstraction for Concurrent Objects,” Theoretical Computer Science 411(51–52), 2010, pp. 4379–4398。
- Nancy A. Lynch and Frits W. Vaandrager, “Forward and Backward Simulations: I. Untimed Systems,” Information and Computation 121(2), 1995, pp. 214–233。
- Martín Abadi and Leslie Lamport, “The Existence of Refinement Mappings,” Theoretical Computer Science 82(2), 1991, pp. 253–284。