我需要实现一个大的内存中键值存储来维护系统运行时数据。主线程(或者让它调用它的事务线程)经常更新键值存储,并且检查点线程获取键值存储的快照并每隔几分钟转储到磁盘。现在我希望检查点线程可以在不暂停事务线程的情况下获取快照。当我搜索Internet时,我们可能只需调用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.
我想知道是否存在其他解决方案来处理这个问题?提前谢谢!
答案 0 :(得分:0)
我建议您不要自己实现,而是使用Redis,这是一个非常快速的内存键值存储。它还提供持久的数据:
http://redis.io/topics/persistence
RDB持久性执行数据集的时间点快照 按规定的时间间隔。
修改:如果您不想使用Redis,请提及以下内容:
现在我希望检查点线程可以不用拍摄快照 暂停交易线程
您不能这样做 - 您需要某种线程同步,以确保在克隆数据结构时不会发生写入。您似乎可以尝试fork()您的进程,这也会暂停您的事务线程,并且分叉实际上比简单地在多个线程之间实现同步锁定重得多。