【问题标题】:Save heap data in a mapped file without copying?将堆数据保存在映射文件中而不复制?
【发布时间】:2014-02-26 16:22:53
【问题描述】:

我正在开发一个应该在多个进程之间共享数据的程序。我使用 mmap() 来映射共享数据。但问题是 mmap() 返回的指针不是很“灵活”(与 malloc() 返回的指针相比)。缓冲区(共享数据)需要动态调整大小。所以现在我所做的仍然是操作堆中的共享数据(malloc,realloc..),然后将其复制到由 mmap() 返回的缓冲区。其他进程需要将共享数据从 mmap() 缓冲区加载到堆中。

这会带来一些性能损失。我想知道是否有一种方法可以直接将堆中的数据分配给映射文件而不进行复制?

【问题讨论】:

  • 该区域是否需要在其他进程查看时增长?
  • 不,它没有。它只需要在写作过程中是动态的。一旦写入过程完成写入,这个区域就可以是不可变的。
  • 然后将数据塞入mmaped 区域,就完成了。在任何情况下,除非您有无可辩驳的测量结果告诉您此数据复制是您程序中的严重瓶颈,否则请不要担心。你的时间很宝贵,电脑很便宜。还要记住premature optimization is the root of all evil

标签: c linux multiprocessing


【解决方案1】:

使用mremap 扩大 mmap 区域。

// first grow the underlying file, then:
char *newp = mremap(p, oldsize, newsize, MREMAP_MAYMOVE);
if (newp == MAP_FAILED) {
    // handle error, probably munmap(p)
}
p = newp;

MREMAP_MAYMOVE 告诉mremap 它可能会更改映射的虚拟地址。这并不意味着它必须复制任何数据,只是它改变了页面在虚拟地址空间中的映射。

【讨论】:

    【解决方案2】:

    您可能对application checkpointing 感兴趣,特别是您可能想使用BLCR 库。

    顺便说一句,你不需要malloc 然后mmap。你可以直接使用mmap

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2013-11-29
      相关资源
      最近更新 更多