用写时复制分配内存



我需要在内存中实现一个大型键值存储,用于维护系统运行时数据。主线程(或者我们称之为事务线程)经常更新键值存储,检查点线程每隔几分钟就会获取键值存储的快照并将其转储到磁盘。现在我希望检查点线程可以在不暂停事务线程的情况下拍摄快照。正如我在互联网上搜索的那样,我们可以简单地调用fork()来获得父进程的一致快照。然而,由于某些原因,我的程序不允许分叉。所以我正在寻找其他解决方案来解决这个问题。一种可能的解决方案是,在事务线程中使用mmap()和MAP_SHARED将文件映射到虚拟内存,然后在检查点线程中使用mmap()和MAP_PRIVATE将同一文件映射到虚拟内存。不幸的是,正如我所测试的那样,事务线程执行的更新仍然会被检查点线程观察到。这是因为以下原因:

  MAP_PRIVATE
              Create a private copy-on-write mapping.  Updates to the
              mapping are not visible to other processes mapping the
              same file, and are not carried through to the underlying
              file.  It is unspecified whether changes made to the file
              after the mmap() call are visible in the mapped region.
我想知道是否有其他的解决方案来处理这个问题?提前感谢!

与其自己实现这个,我建议你考虑使用Redis,这是一个非常快速的内存键值存储。它还提供了数据的持久化:

http://redis.io/topics/persistence

RDB持久性执行数据集的时间点快照

Edit:在你不想使用Redis的情况下,你提到以下内容:

现在我希望检查点线程可以在没有暂停事务线程

您不能这样做——您将需要某种线程同步,以确保在克隆数据结构时不会发生写操作。您似乎可以尝试fork()您的进程,这也会暂停您的事务线程,并且分叉实际上比简单地在多个线程之间实现同步锁要重得多。

相关内容

  • 没有找到相关文章

最新更新