c - 在不复制的情况下将堆数据保存在映射文件中?

标签 c linux multiprocessing

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

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

最佳答案

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

关于c - 在不复制的情况下将堆数据保存在映射文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22047210/

相关文章:

c++ - 函数原型(prototype)和函数实现签名不一致地使用 const 可以吗?

linux - 如何查找 Linux 中存在的堆大小?

c++ - 我如何在某些全局击键时使用 Python 或 C++ 将一些文本粘贴到 linux 中的当前事件应用程序

Python 3.6 multiprocessing.Pool 间歇性无法在 KeyboardInturrupt 上退出

c - 正则表达式测试台

c++ - 如何通过 Boost::MPI 发送 2d C 样式数组?

c - 检查指针数据时出现段错误

linux - 在不中断的情况下读取生活过程内存

python - 阻止 Flask 初始化阻塞

python - python中视频帧的多处理