【问题标题】:allocate memory with copy-on-write使用写时复制分配内存
【发布时间】:2014-05-25 14:20:03
【问题描述】:

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

  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)?
  • 我实现的key-value store其实很简单——没有Redis采用的各种复杂技术:P
  • 更新了非 Redis 案例的答案。

标签: c linux malloc


【解决方案1】:

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

http://redis.io/topics/persistence

RDB 持久性执行数据集的时间点快照 在指定的时间间隔。

编辑:如果您不想使用 Redis,请提及以下内容:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2014-06-04
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多