“公平反例必须同时违反规格并满足公平假设。给积添加 $F J={G z}$,同时保留原接受集 $F A={R b,W b}$;没有一个可达 SCC 同时命中两者,故公平反例语言为空。不能用 $…”
形式陈述
公平性筛选无限执行
系统模型通常允许调度器在多个使能动作中选择。公平性约束从全部无限路径中选出一部分 admissible paths,再只在这些路径上判断活性;它不改变某一步是否属于转移关系。
设动作
强公平要求:若
因此强公平排除的路径更多;两者名称在部分文献中对应 justice 与 compassion,但术语映射需随工具定义确认。
直觉
间歇使能区分强弱
两个进程竞争锁。进程 P 的 enter 在锁空闲时使能,但进程 Q 每次释放后立刻重新获取,使 P 的动作只在离散瞬间反复使能,从未持续使能。
这条无限执行不违反 P 的弱公平,因为不存在一个后缀让 enter_P 一直使能;它违反强公平,因为 enter_P 无限多次获得机会却从不执行。
若调度器从某时刻起始终把 P 留在 runnable 队列却从不调度,弱公平已经足以排除。例子必须跟踪 enabled 状态,而不能只统计某动作“看起来等了很久”。
例子与边界
公平不是模型自动属性
异步模型允许任意有限延迟,往往也允许某进程永远不被调度。仅因为所有进程在现实操作系统中“通常会运行”,不能在证明里无声删除饥饿路径。
可采纳执行会同时约束故障数、消息交付和调度公平。公平性应写成环境或调度器假设;系统算法的保证通常是“对所有满足这些假设的执行”。
若实现运行在没有相应调度保证的平台上,模型内活性证明不适用。相反,安全性质通常对删除路径保持:即使不假设公平,互斥也应对所有执行成立。
justice、compassion 与状态集合
符号模型检查常用 fairness sets。justice 条件给出状态集合
动作公平可通过增加“动作刚执行”命题编码成状态公平。这个转换会扩展状态,且 enabled/taken 的标记必须准确;漏标使能状态会把不公平路径误判为公平。
多个公平条件取合取。条件越多,保留路径越少,活性越容易成立,也越可能依赖不现实假设。公平假设应最小化并单独审查。
与安全—活性的关系
安全—活性分解说明公平性本身通常是对无限行为的 liveness 型限制:任意有限前缀还可以通过未来调度修复,无法仅凭一个有限坏前缀判定永远不公平。
加入公平性可能使“每个请求最终响应”成立,但不会修复“两个进程同时进入临界区”的安全反例。后者一旦发生,即使未来调度完美公平也无法撤销。
公平也不等于概率一事件。随机调度下某动作以概率
验证与反例边界
检查公平前提下的活性时,真正反例必须是合法初始无限路径,满足所有公平假设,同时违反待验证性质。一个持续违反 fairness set 的循环说明该路径不公平,会被前提排除;它不是公平前提下的性质反例。算法必须同时检查否定规格的接受条件和公平条件,单找任意 SCC 不够。
公平性若写得过强,模型检查会“证明”实际上做不到的响应。诊断报告应显示反例是否因不公平被排除,并把 fairness assumptions 与系统 guarantees 分栏呈现。
共享请求系统:弱公平何时可换成 justice
取自动机论模型检查中的系统:taken(serve) 表示所执行的边是
系统的无限路径只有两类行为。若
现在考虑响应性质
一般系统中,serve 可能最终不再使能,此时弱公平的前件为假,即使 grant 从此永不出现也不违反公平;grant 也可能由另一个动作产生。因此用状态集合
多个接受集合必须在同一个循环区域兑现
在上述三态系统中,弱公平已证明可写成 justice
积的三个 SCC 是
更一般地,广义Büchi 接受条件要求同一个可达且含正长度循环的强连通分量(SCC)命中每个接受集。强连通性保证可以在分量内依次访问各集合的代表并返回入口,形成一个可无限重复的闭合游走。该游走不一定是简单环:例如两只环共用一个中心,一个接受集只在左环,另一个只在右环,就需要重复中心来轮流访问二者。分别在两个不相通的 SCC 命中义务不能拼成一个无限证书。
一般强公平的
这类长期频率条件也不同于每次请求都须响应:一个请求只出现一次却永远得不到服务,可能仍满足相应Streett条件。实际验证必须先确定待表达的是动作公平还是逐请求义务,再选择自动机与判空算法。
推论与应用
选择公平对象
公平性可以施加在进程、动作或具体转移上,三者不总等价。一个进程被无限调度,仍可能每次只执行不相关动作;一个动作标签在多个组件中共享,也无法说明究竟哪个实例获服务。证明饥饿自由时,应把公平对象细化到真正承担进展义务的 transition instance,并明确使能谓词在何种原子状态上求值。
参考资料
- Leslie Lamport, “Proving the Correctness of Multiprocess Programs,” IEEE Transactions on Software Engineering SE-3(2), 1977, pp. 125–143。
- Zohar Manna and Amir Pnueli, The Temporal Logic of Reactive and Concurrent Systems, Springer, 1992, Chs. 3–4。
- Christel Baier and Joost-Pieter Katoen, Principles of Model Checking, MIT Press, 2008, §§3.5, 4.6, 6.7。