将堆数据保存在映射文件中而不复制?

时间:2014-02-26 16:22:54

标签: c linux multiprocessing

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

这带来了一些性能问题。我想知道是否有一种方法可以直接将堆中的数据分配给mmaped文件而无需复制?

2 个答案:

答案 0 :(得分:0)

使用mremap增加mmap'd区域。

// 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它可能会更改映射的虚拟地址。这并不意味着它必须复制任何数据,只是它改变了虚拟地址空间中页面的映射。

答案 1 :(得分:0)

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

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