“干扰自由把若干顺序 proof outline 连接成并发安全证明,是 Owicki–Gries 方法 的全局检查阶段。依赖—保证推理把外来动作概括为 rely 关系,再以另一组件的 gua…”
形式陈述 ​
设并行程序为
第二阶段检查 干扰自由。对线程
若各纲要局部正确且两两无干扰,则在部分正确性语义下可合成
更一般的外层前后条件通过 consequence 接入。结论量化所有保持所声明原子粒度的交错;只有当全部线程终止时,才要求合取后置成立。
直觉
方法把困难分为“自己走路是否正确”和“别人从身边经过时路标会不会倒”两部分。局部纲要仍使用熟悉的顺序 Hoare 推理;全局检查则把调度器可能插入的每个外来动作当成一次断言稳定性测试。这样无需枚举完整交错树,却仍逐项覆盖交错造成的风险。
代价是证明纲要并不真正模块化。新增一个线程,会给其他每份纲要增加一批非干扰义务;改变某个控制点断言,也可能迫使全局重查。辅助变量可以记录逻辑进度,让不可见的控制事实进入不变式,但它们必须是保守的 ghost:擦除后原程序行为不变,不能偷偷替程序作调度决定。
经典辅助变量规则通常要求 ghost 赋值不影响真实变量的计算或控制,并能从增广执行中擦除而得到原执行。ghost 可以与一个真实原子动作同步更新,用于记录该动作已发生;若单独增加可被调度观察的 ghost 步,还要说明这些停顿不会改变待证历史与终止性质。
例子与边界
初态为
< x := x + 1; d_i := 1 >
并且动作前有
动作 1 把
动作 2 的计算对称。二者都保持
若尖括号内两条赋值实际可被抢占,执行 x:=x+1 后、设置
非干扰检查还包括另一线程动作对
方法仍不证明死锁自由、公平或终止。即使所有断言在每一步都保持,调度器也可以永远不运行某个线程;需要总正确性或时序推理另行处理。
推论与应用
Owicki–Gries 方法适合线程数固定、原子动作明确的共享变量算法。互斥协议、短并行循环和带 ghost program counter 的细粒度算法都可用它把安全性质还原成顺序验证条件。工具可以自动枚举跨线程 action/assertion 对,求解器失败时给出具体干扰状态。
当组件要在不同环境中复用时,依赖—保证推理用关系规格替代全局两两检查;当干扰主要来自堆别名时,并发分离逻辑用资源所有权使许多交叉义务在语义上不可能发生。这些后续方法没有取消原子性和稳定性责任,而是把它们放进更局部的接口。
参考资料
- Susan Owicki and David Gries, “An Axiomatic Proof Technique for Parallel Programs I,” Acta Informatica 6, 1976, pp. 319–340。
- Leslie Lamport, “Proving the Correctness of Multiprocess Programs,” IEEE Transactions on Software Engineering SE-3(2), 1977, pp. 125–143。
- Krzysztof R. Apt, Frank S. de Boer, and Ernst-Rüdiger Olderog, Verification of Sequential and Concurrent Programs, 3rd ed., Springer, 2009, Chs. 8–10。