“设 $T$ 是动作集合。按动作独立与交换的状态语义,关系 $I\subseteq T\times T$ 对称且无反射;对每个 $(a,b)\in I$ 和每个可达状态 $s$,若 $a,b$…”
形式陈述 ​
本页先采用偏序约简中最常见的确定性动作粒度:每个动作标签已经细化为状态上的确定性偏变换。在标号转移系统的状态
通常要求对称且反自反。对任意
- 使能保持:执行
后 仍使能,执行 后 仍使能; - 交换性:两种次序都到达同一状态,亦即
。
第一项不能由第二项省略。若某一次序中第二个动作根本无法执行,就不存在两条完整路径可供比较;仅仅发现另一条路径偶然到达相同终态,不足以判定独立。未进入
这里的“独立”描述转移之间的语义干扰,与概率论中随机事件满足
直觉 ​
两个动作独立,意味着它们各自处理不同的那部分世界:先做哪一个都不会挡住另一个,也不会留下不同结果。可以把它想成两个人分别在文档的不同段落改字。交换提交顺序后,最终文档相同,任何一人的修改也不会使另一人的修改失去适用位置。
“最后结果碰巧一样”比独立弱得多。两个事务都先检查余额再更新,某组输入上可能恰好写回同一个数,但一次读到的中间值已经可能改变另一次决策;这种动作不能因为一个样例同终态就视为可交换。独立性必须覆盖规定范围内的所有可达共同使能状态,而不是从单条运行归纳。
例子与反例 ​
线程 P 写自己的局部变量 p,线程 Q 写自己的局部变量 q。若这些位置不别名,两个赋值彼此不改变使能条件,先 P 后 Q 与先 Q 后 P 都得到同一对值,因此可以列入
若 x 而 x,执行顺序可能改变
异常和控制流同样属于状态。动作
静态关系与动态关系 ​
最简单的静态分析用读写集合判定:两个动作若访问集合不冲突,就视为独立;只要可能别名或涉及未知调用,就保守判为依赖。这种关系一次计算后可用于全部状态,容易验证,但数组下标、对象身份和分支条件不够精确时会丢掉大量可交换机会。
动态独立性可以引用一次具体执行中的地址、锁和分支。例如两条同为 write(a[i]) 的语句,在本次运行中下标不同便可能交换;换一组输入后下标相同又会依赖。此时关系属于事件实例而非粗粒度动作标签,缓存或迁移结论时必须连同产生判断的状态条件保存。
若原始 LTS 允许同一状态与标签有多个后继,就不能用单值记号
弱内存还会改变动作语义。在顺序一致模型中互不干扰的源代码读写,经编译器或硬件重排后可能通过可见性影响另一线程。要在弱内存验证中宣称独立,需要对模型允许的传播、屏障和原子顺序证明交换性,不能直接复用源代码级的不同变量判据。
推论与应用 ​
独立动作可以反复作相邻交换,由此把多个全序交错归入同一等价类。Mazurkiewicz trace把这件事抽象为词的商结构;偏序约简则在搜索中只保留足够的代表交错,避免为无关动作的排列重复探索同一行为。
局部交换并不独自保证任意性质都被保存。若规格直接观察动作先后、使用 next 运算符,或要求无限执行中的公平性,即使终态一致,也可能区分两个排列。约简算法因此还要结合动作可见性、cycle proviso 与待验证性质说明保存范围;动作独立关系只提供可交换的语义基础,不包办完整约简证明。
参考资料
- Antoni Mazurkiewicz, “Trace Theory,” in Petri Nets: Applications and Relationships to Other Models of Concurrency, Springer, 1987, pp. 278–324。
- Patrice Godefroid, Partial-Order Methods for the Verification of Concurrent Systems, Springer, 1996, Chapters 2–3。
- Cormac Flanagan and Patrice Godefroid, “Dynamic Partial-Order Reduction for Model Checking Software,” POPL, 2005, pp. 110–121。