Page 300 - 《软件学报》2026年第5期
P. 300

唐瑞泽 等: 分布式系统模型检验技术研究进展                                                          2179


                 率极低, 基本不可行.
                    为解决上述问题, VeriSoft 提出了高效的无状态搜索算法              (efficient stateless search) [77] , 引入偏序约减  (partial-
                 order reduction) [92] 等技术来减少对等价执行路径的重复探索. 尽管该算法仍在形式上不保存状态, 其搜索决策实际
                 上利用了历史信息来约减状态空间. 由于             VeriSoft 是最早面向真实程序进行系统性状态空间探索的工具, 首次系
                 统化提出了无状态搜索的概念, 其定义和实现方式影响深远. 本文后续提及的“无状态搜索”均指这种结合偏序约
                 减的高效实现方式, 而非原始意义上的完全无历史信息的搜索算法.
                    VeriSoft 核心思想是, 若多个动作无依赖关系         (如不同节点上的独立操作), 则不同执行顺序最终到达的状态等
                 价. 例如, 若网络缓存中有发送至节点          A  和  B  的消息, 则  A  先接收或  B  先接收不会影响二者都接收消息后的最终
                 状态. 偏序约减通过选择性搜索          (selective search) 减少冗余探索, 即在每个状态仅搜索部分使能动作, 而非所有可
                 能的动作.
                    VeriSoft 算法  (图  4) 基于深度优先搜索, 并结合 sleep-set [93] 和 persistent-set [92] 剪枝优化. Stack 结构存储从初始
                 状态到当前状态的转移动作          (第  9  行和第  12  行), 用于支持撤销  (Undo) 操作  (第 13 行), 即通过重放  Stack 中的转
                 移动作重构先前状态. 每个状态          s 关联  Persistent 集合和  Sleep  集合: Persistent 集合  (由 Persistent_Set 函数返回)
                 包含被使能的部分动作, 未包含的动作与其独立, 因此仅探索 Persistent 集合可避免重复探索等价路径                         (Mazurkie-
                 wicz trace) [94] . Sleep 集合记录已探索的独立事件组合, 作为深度优先搜索的参数          (第 11 行), 在下一次探索时排除
                 (第 6 行), 进一步减少等价路径的重复搜索.

                                           1   Initialize:  Stack is empty;
                                           2   Search() {
                                           3    DFS( );
                                           4   }
                                           5   DFS(set:  Sleep) {
                                           6    T = Persistent_Set () \ Sleep;
                                           7    while T ≠  do {
                                           8      take  t out of T;
                                           9      push( t) onto Stack;
                                           10     Execute( t);
                                           11     DFS({t′ ∈ Sleep | t′ and  t are independent});
                                           12     pop t from  Stack;
                                           13     Undo(t);
                                           14     Sleep = Sleep ∪ {t};
                                           15   }
                                           16  }

                                             图 4 无状态搜索算法       (引自 VeriSoft [77] )

                    无状态搜索算法的优势在于避免存储状态带来的问题. 相比广度优先或随机搜索, 深度优先搜索减少了无状
                 态搜索中高开销的回溯次数, 并结合 Stack 结构, 仅存储必要的路径信息以在回溯时重构状态, 从而降低事件存储
                 成本. 其缺点是无法检测状态空间中的环, 遇到环时可能导致无限递归, 可通过限制搜索深度来规避. 此外, 由于不
                 支持环检测, 该算法无法直接验证标准的活性              (liveness) 属性, 但可通过检查有限事件序列来近似检测特定活性属
                 性, 例如, 若系统未终止于某个期望状态, 则可判定为死锁.
                  3.2.2    状态空间约减方法
                    状态空间探索面临状态爆炸问题, 导致在有限时间内无法穷尽所有状态, 从而影响 DMCK 的有效性. 因此, 所
                 有相关研究均提出了相应的应对方案. 传统 DMCK 研究主要集中在适用于分布式系统的通用状态空间约减技术
                 上. 由于状态空间约减的核心在于: 约减后的探索路径是否仍能覆盖所有可能导致属性违反                             (即系统缺陷) 的执行
                 路径, 这一能力通常被称为约减算法的 soundness         [95] , 是模型检验中确保验证有效性的基础. 为便于后文讨论, 本文
                 将满足   soundness 要求的方法称为“可靠型约减方法”, 而不满足           soundness 要求的方法称为“不可靠型约减方法”.
                    可靠型   (sound) 约减方法: 可靠型约减方法包括状态去重、对称约减、偏序约减和动态接口约减, 这些方法相
   295   296   297   298   299   300   301   302   303   304   305