我需要以最快的方式定期将文件与内存同步.
我想我想要的是有一个mmap'd文件,它只能手动同步到磁盘.我不确定如何防止任何自动同步发生.
除非我手动指定,否则无法修改该文件.关键是要有一个检查点文件,它将状态的快照保存在内存中.我想尽可能避免复制,因为这需要相当频繁地调用,速度很重要.
mmap不能用于此目的。无法阻止数据写入磁盘。在实践中,使用mlock()使内存不可交换可能会产生副作用,阻止其写入磁盘,除非您要求写入,但不能保证。当然,如果另一个进程打开该文件,它将看到缓存在内存中的副本(包含最新的更改),而不是物理磁盘上的副本。在很多方面,您应该做什么取决于您是否正在尝试与其他进程进行同步,或者只是为了在崩溃或电源故障时确保安全。
如果您的数据量很小,您可以尝试许多其他方法来原子同步到磁盘。一种方法是将整个数据集存储在一个文件名中,并按该名称创建一个空文件,然后删除旧文件。如果启动时存在 2 个文件(由于极不可能发生崩溃),请删除较旧的文件并从较新的文件恢复。write() 如果您的数据大小小于文件系统块、页面大小或磁盘块,也可能是原子的,但我不知道对此效果有任何保证。你必须做一些研究。
另一种非常标准的方法只要数据不太大以至于 2 个副本无法容纳在磁盘上就可以使用:只需使用临时名称创建第二个副本,然后将rename()其覆盖在旧副本之上。rename()始终是原子的。这可能是最好的方法,除非您有理由不这样做。