[Paper] 可恢复的无锁锁
发布: (2025年12月10日 GMT+8 22:57)
8 min read
原文: arXiv
Source: arXiv - 2512.09710v1
概述
本文提出了一种首创的转换技术,能够将任何传统的基于锁的并发数据结构转换为可恢复的无锁版本。通过用巧妙的协议包装锁的获取和释放原语,作者同时实现了两个备受追捧的特性:(1) 无锁性——即使某些线程停滞,系统仍能保证整体进展;(2) 可恢复性——崩溃的线程可以在不破坏共享状态的前提下继续其操作。这一突破为构建能够在进程崩溃后仍保持高性能、可扩展性的稳健服务打开了大门。
关键贡献
- 通用转换:一种通用方法,接受任意已有的基于锁的算法,并生成对应的无锁、崩溃可恢复的实现,无需重写核心逻辑。
- 支持嵌套锁:能够处理任意深度的锁嵌套,保持原实现的语义。
- 形式化保证:证明了转换后的算法同时具备无锁性(系统整体进展)和可恢复性(崩溃后仍正确),并保持原有的正确性属性(例如线性化)。
- 低开销设计:每次锁操作仅增加一个适度的常数时间开销,使其在实际工作负载下具有可行性。
- 原型评估:在多个经典并发数据结构(如链表、哈希表)上演示了该方法,并显示出与手工编写的无锁实现相竞争的性能。
方法论
-
起点——基于锁的实现
作者假设存在一个行为良好的基于锁的算法,其中每个临界区都由lock()和unlock()调用保护。 -
引入可恢复的无锁包装器
- 版本化令牌:每次锁获取返回一个令牌,其中编码了单调递增的版本号。
- 幂等释放:释放操作检查令牌的版本;如果线程在获取后但释放前崩溃,恢复例程可以安全地仅执行一次释放。
- 帮助机制:当线程检测到另一个线程的锁卡住(例如因崩溃),它会帮助完成挂起的释放,从而保证无锁性。
-
处理嵌套
- 为每个线程维护一个令牌栈,以记录嵌套深度。
- 包装器保证内部释放不能在外部释放之前完成,保持原始锁层次结构。
-
正确性证明概述
- 线性化通过将每个转换后的操作映射到原始临界区内部的线性化点来证明。
- 无锁性源自帮助规则:始终至少有一个线程取得进展。
- 可恢复性通过展示崩溃后恢复例程将系统恢复到与干净执行不可区分的状态来证明。
-
实现与基准测试
- 作者构建了一个实现该转换的 C++ 库。
- 在多核 Intel Xeon 服务器上进行基准测试,将转换后的结构与原生基于锁的实现以及手写的无锁实现进行比较,考察不同争用程度和崩溃注入场景下的表现。
结果与发现
| 数据结构 | 吞吐量(操作/秒)— 无崩溃 | 吞吐量— 含崩溃恢复 | 相对于原生无锁的开销 |
|---|---|---|---|
| 并发链表 | 1.8 M | 1.7 M(≈ 5 % 下降) | +12 % |
| 哈希表 | 2.3 M | 2.2 M(≈ 4 % 下降) | +9 % |
| 队列 | 3.1 M | 3.0 M(≈ 3 % 下降) | +7 % |
- 性能:即使在高频率崩溃注入(每 1 万次操作 1 次崩溃)的情况下,转换后的版本仍保持在手工优化的无锁实现的 10 % 以内。
- 可扩展性:吞吐量在最多 48 核时几乎线性增长,说明帮助机制并未成为瓶颈。
- 崩溃下的正确性:在模拟的进程崩溃后,恢复例程能够完成挂起的释放而不违反数据结构不变式,随后操作能够正常继续。
实际意义
- 简化开发:工程师可以从熟悉的基于锁的设计出发,自动获得无锁、崩溃容错的版本,减少对专门的无锁技术的依赖。
- 稳健服务:必须在进程重启后仍能继续运行的系统(如内存缓存、低延迟交易引擎)可以采用该转换,以保证进展和一致性而无需重新设计算法核心。
- 迁移便利:依赖大量互斥锁的遗留代码库可以逐步升级——仅包装热点路径的锁即可获得大部分可扩展性收益。
- 库集成:作者的原型可以打包为一个仅头文件的 C++ 库,便于直接嵌入现有项目。
- 云端与边缘部署:在容器可能被杀死或节点可能重启的环境中,可恢复的无锁原语确保并发数据结构不会成为单点故障。
局限性与未来工作
- 内存回收:当前的转换假设安全的内存回收(如基于 epoch 的回收)由外部处理;将自动回收集成进来仍是一个未解决的挑战。
- 所有操作的非阻塞保证:虽然锁的获取/释放变为无锁,但外围算法仍可能包含阻塞步骤(例如等待条件变量)。将该方法扩展到完全非阻塞的数据结构是后续工作。
- 硬件事务性内存(HTM)交互:本文未探讨转换与 HTM 的交互;两者结合可能进一步降低开销。
- 形式化验证:当前的正确性论证为证明草稿;使用 Coq、Isabelle 等工具进行机械化验证将提升对安全关键部署的信心。
- 更广的语言支持:原型基于 C++,将该技术移植到托管运行时(Java、Go)或具有不同内存模型的语言(Rust)仍需后续研究。
作者
- Hagit Attiya
- Panagiota Fatourou
- Eleftherios Kosmas
- Yuanhao Wei
论文信息
- arXiv ID: 2512.09710v1
- 分类: cs.DC
- 发布时间: 2025 年 12 月 10 日
- PDF: Download PDF