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

时间:2013-11-19 15:22:41

标签: c++ multithreading data-structures b-tree lock-free

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

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

限制如下:

  1. 数据结构必须驻留在磁盘上。
  2. 有一个线程写入数据结构,还有许多其他线程从中读取。
  3. 每次阅读都是原子的。 (假设我可以为此原子地读取大小为32 / 64KB的块,并且所有对象都小于大小。
  4. 写入不应该阻止读取,因为可以假设我可以以原子方式写入32 / 64KB的块。
  5. 根本无法使用锁。
  6. 有什么建议吗?

    我正在考虑使用类似B-Tree的东西,当需要分割节点和编写新数据,而不是将它们移动到文件末尾的新节点,然后只更新指向将驻留的节点的指针。在一些其他文件中(原始块将被标记为空闲并添加到freestore)

    但是,如果我的映射文件大于32 / 64Kb,我会遇到问题。假设我希望它只能容纳100万个对象指针而不是4个字节/指针我得到400万个字节4 Megs ...(甚至超过10亿个对象......)这意味着映射文件不能以原子方式写入。

    因此,如果某人对如何实施上述内容有更好的建议 - 甚至某些方向,我们将不胜感激。

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

    谢谢, 最大

2 个答案:

答案 0 :(得分:3)

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

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

虽然MVCC比CPU / RAM无锁结构更加复杂,但是一旦拥有它,许多相同的乐观无锁模式都适用于使用它。

答案 1 :(得分:1)

LMDB将毫无问题地完成所有这些工作。它是一个MVCC B +树,读者完全无锁。