我正在开发一个应该在多个进程之间共享数据的程序。我使用mmap()来映射共享数据。但问题是mmap()返回的指针不是很“灵活”(与malloc()返回的指针相比)。缓冲区(共享数据)需要动态调整大小。所以我现在所做的仍然是在堆中操作共享数据(malloc,realloc ..),然后将其复制到mmap()返回的缓冲区中。其他进程需要将共享数据从mmap()缓冲区加载到堆。
这带来了一些性能问题。我想知道是否有一种方法可以直接将堆中的数据分配给mmaped文件而无需复制?
答案 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
。