Skip to content

安全性与活性

Safety and liveness · Correctness properties

把系统正确性分为坏事永不发生与好事最终发生两类性质。

条目类型
原则

形式陈述

固定事件或状态字母表 Σ,并先取无限迹宇宙 ΩΣω。系统性质是迹集合 PΩΩ 上采用由有限前缀生成的相对前缀拓扑。记 uσ 表示有限迹 u 是无限迹 σ 的前缀,并令 Pref(Ω)Ω 中迹的所有有限前缀。

性质 P 是安全性质,当且仅当每条违反它的迹都有一个不可修复的有限坏前缀:

σΩP,uσ,ρΩ,uρρP.

性质 P 是活性质,当且仅当任意合法有限前缀仍能扩展为某条满足性质的迹:

uPref(Ω),ρP,uρ.

若取 Ω=Σω,第二式就是通常写作“对每个 uΣ 都存在满足性质的无限延伸”。对具体系统,Ω 必须明确纳入哪些调度、故障、消息交付和公平性假设;改变这个执行宇宙,会改变同一句话是否构成活性保证。

直觉

安全性约束“坏事永远不会发生”。一旦有限历史已经出现两个进程同时进入临界区,任何未来都无法删除这个事实;这段历史已经是完整的反证。

活性关心承诺能否在无限执行中兑现。单凭一次请求已经等待很久,仍不能断言它永远不会完成;只有连同公平调度、消息最终送达等执行假设,才能排除永久拖延。永不响应的系统可以很安全却毫无活性,快速给出矛盾结果的系统则可能持续进展但不安全。

安全性的有限坏前缀与活性的可延伸前缀
例子与边界

互斥锁的安全性是任意时刻至多一个进程进入临界区;若观察到两个进程同时进入,有限执行前缀已经永久否证它。无饥饿性则要求合格的持续请求者最终进入临界区,正如“每个请求最终得到响应”一样属于活性:无论已经等待多久,都还不能据此断言它永远不会发生。

在记录时间的迹模型中,“每个请求在 100 ms 内完成”是安全性质:一旦时钟越过截止时间仍未完成,就出现了不可修复的有限坏前缀。要实现或证明这项安全约束,通常还需时钟精度、调度和网络延迟等环境假设,但这些假设不是把性质重新分成安全与活性。死锁自由也不自动推出无饥饿:系统可能一直有某个线程进展,却永久忽略另一个线程。

推论与应用

在固定 Ω 及其前缀拓扑下,Alpern–Schneider 分解定理说明每个性质 PΩ 都可写成安全性质 S 与活性质 L 的交,即 P=SL。分解一般不唯一。改变公平性、故障或调度假设会改变合法执行宇宙,也可能改变闭包、坏前缀和分类;有时限的请求响应会产生有限坏前缀,不能只凭“最终”二字归到活性一侧。

两类性质对应不同证明义务。在状态机上,安全性通常证明初态满足不变式且每一步保持它;违反时,一条到达坏状态的有限前缀已经足够。活性则量化无限执行,需要说明持续使能的动作为什么不能永远被推迟;违反时,反例通常包含可无限重复的环。公平性既可写进性质,也可通过可容许执行限制 Ω,但两种放置方式必须在结论中显式说明。

具体并发术语应回到各自页面核对完成事件、参与者量词和环境假设。本页只提供有限坏前缀与无限兑现这条分类轴,不把某个名称预先判成纯安全或纯活性,也不靠手工维护下游术语清单。

参考资料
  • Bowen Alpern and Fred B. Schneider, “Defining Liveness,” Information Processing Letters 21(4), 1985, pp. 181–185;给出基于有限前缀延伸的 liveness 定义及其与 safety 的区分。
  • Bowen Alpern and Fred B. Schneider, “Recognizing Safety and Liveness,” Distributed Computing 2, 1987, pp. 117–126;给出拓扑识别条件,并系统化 safety–liveness 分解。
  • Leslie Lamport, “Proving the Correctness of Multiprocess Programs,” 1977.
关系图谱19 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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