在磁盘上实现无锁数据结构

Implementing a lock free data structure on disk

本文关键字:数据结构 实现 磁盘      更新时间:2023-10-16

我有一个有趣的挑战,对于那些在无锁数据结构和基于磁盘的数据结构方面有强大背景的人来说。

我正在寻找一种在C++中构建数据结构的方法,以容纳不同数量的对象。

限制是这样的:

  1. 数据结构必须位于磁盘上
  2. 有一个线程在向数据结构写入,而其他许多线程则从中读取
  3. 每一次阅读都是原子性的。(假设我可以原子化地读取32/64KB大小的块,并且所有对象的大小都比它小
  4. 写入不应该阻止读取,因为可以假设我也可以以原子方式写入32/64KB的块
  5. 锁根本无法使用

有什么建议吗?

我想使用类似B树的东西,当需要拆分节点并写入新数据时,将它们移动到文件末尾的新节点,然后只更新指向节点的指针,这些节点将驻留在其他文件中(原始块将标记为空闲并添加到自由存储中)

但是,如果映射文件大于32/64Kb,我会遇到问题。。比方说,我希望它只容纳100万个对象指针,而不是4字节/指针,我可以容纳400万字节,大约4兆。。。(还有10亿个对象,甚至更多。)这意味着映射文件不能以原子方式编写。

因此,如果有人对如何实现上述目标有更好的建议,甚至是一些方向,我们将不胜感激。

据我所知,B-Tree的所有开源/商业实现都使用某种锁,我无法使用。

谢谢,最大

仅仅假设读/写是原子的并不会走得太远——主要是因为它们不是原子的,并且最终会以一种会扼杀性能的方式来模拟它。

听起来你想研究MVCC,这是设计无锁数据库时使用的非常标准的机制。基本概念是,每次读取都会获得数据库的"快照"——通常以无锁的方式实现,只保留旧页面,只对新页面进行任何修改。一旦旧页面被读者使用完毕,它们最终会被标记为可重复使用。

虽然MVCC比CPU/RAM无锁结构要复杂得多,但一旦你拥有了它,许多相同的乐观无锁模式就会应用于使用它。

LMDB将毫无问题地完成所有这些。这是一个MVCC B+树,读卡器完全没有锁定。