#lock-free #atomic #garbage #free-memory #hazard-pointers #memory-object

seize

为并发数据结构提供快速、高效和稳健的内存回收

18 个版本

0.4.5 2024 年 7 月 18 日
0.4.1 2024 年 5 月 11 日
0.3.1 2024 年 3 月 12 日
0.2.5 2022 年 7 月 20 日
0.0.0 2021 年 9 月 27 日

#76 in 并发

Download history 5972/week @ 2024-05-04 7072/week @ 2024-05-11 7615/week @ 2024-05-18 7074/week @ 2024-05-25 8729/week @ 2024-06-01 9189/week @ 2024-06-08 6673/week @ 2024-06-15 7950/week @ 2024-06-22 7779/week @ 2024-06-29 10043/week @ 2024-07-06 8015/week @ 2024-07-13 8986/week @ 2024-07-20 10017/week @ 2024-07-27 8081/week @ 2024-08-03 6835/week @ 2024-08-10 6298/week @ 2024-08-17

32,748 每月下载量
用于 33 Crates(6 直接使用)

MIT 许可证

89KB
1K SLoC

seize

crates.io github docs.rs

为并发数据结构提供快速、高效和稳健的内存回收。

查看快速入门指南以开始使用。

背景

并发数据结构面临何时安全释放内存的问题。尽管对象可能已经逻辑上删除,但之前加载它的其他线程可能仍在访问它,因此不能立即释放。多年来,已经设计了多种算法来解决此问题。然而,大多数传统的内存回收方案在性能、效率和稳健性之间做出权衡。例如,基于 时期回收 的方案速度快且轻量级,但稳健性不足,因为停滞的线程可以阻止回收 所有 已退休的对象。另一个流行的方案 危害指针,跟踪单个指针,使其高效和稳健,但通常要慢得多。

另一个经常没有被考虑的问题是工作负载平衡。在大多数回收方案中,退休对象的线程是回收它的线程。这导致在以读取为主的工作负载中的回收不平衡;当只有一小部分线程写入时,并行性降低,降低内存效率。

实现

Seize 基于基于 hyaline 回收方案,该方案使用引用计数来确定何时可以安全地释放内存。然而,引用计数器仅用于已退休的对象,使其能够避免传统引用计数方案中产生的高开销,在每次内存访问时都需要修改共享内存。回收是自然平衡的,因为具有对象最后一个引用的线程是释放它的线程。这消除了检查其他线程是否已取得进展的需要,从而在不牺牲性能的情况下实现可预测的延迟。还可以跟踪时期以防止停滞线程,使回收真正无锁。

Seize提供了与基于epoch方案的竞争力性能,而内存效率与hazard pointers类似。Seize兼容所有支持单字原子操作(如FAA和CAS)的现代硬件。

无运行时依赖