seize
为并发数据结构提供快速、高效且健壮的内存回收。
请查看快速入门指南以开始使用。
背景
并发数据结构面临着决定何时安全释放内存的问题。尽管一个对象可能在逻辑上已被移除,但之前加载它的其他线程可能仍在访问它,因此立即释放是不安全的。多年来,人们设计了许多算法来解决这个问题。然而,大多数传统的内存回收方案在性能、效率和健壮性之间做出了权衡。例如,基于时代的回收虽然快速且轻量,但缺乏健壮性,因为一个停滞的线程可能会阻止所有已退役对象的回收。危险指针是另一种流行的方案,它跟踪单个指针,使其高效且健壮,但通常速度较慢。
另一个经常被忽视的问题是工作负载平衡。在大多数回收方案中,退役对象的线程也是回收它的线程。这在读取密集型工作负载中导致回收不平衡;当只有一小部分线程在写入时,并行性降低,从而降低了内存效率。
实现
Seize 基于hyaline回收方案,它使用引用计数来确定何时可以安全地释放内存。然而,引用计数器仅用于已退役的对象,这使得它避免了传统引用计数方案中每次内存访问都需要修改共享内存所带来的高开销。回收自然地得到平衡,因为最后引用对象的线程负责释放它。这消除了检查其他线程是否取得进展的需要,从而在不牺牲性能的情况下实现可预测的延迟。还可以跟踪时代以防止线程停滞,使回收真正无锁。
Seize 提供了与基于时代的方案相当的性能,同时内存效率与危险指针相似。Seize 兼容所有支持单字原子操作(如FAA和CAS)的现代硬件。