在内存压力下匿名mmap优于malloc的优点

时间:2011-11-24 23:30:44

标签: c++ c memory memory-management

我正在运行一些大型数据处理代码(在运行Linux的Pentium上)。数组的大小足以使进程交换。到目前为止它正在工作,可能是因为我试图保持我的读写连续。但是,我很快就需要处理更大的数组。在这种情况下,切换到匿名mmapped块有帮助吗?

如果是这样,请解释原因。

在我的浅薄理解中,mmap实现了一个从tmpfs分区安装的内存映射文件,在内存压力下它将回退到交换机制。我想了解的是mmap如何比标准的malloc做得更好(为了我或假设它确实更好,我不知道是否如此)。

注意:请不要建议获得64位或更多RAM。遗憾的是,这不是一种选择。

2 个答案:

答案 0 :(得分:15)

支持malloc()分配的内存由内核处理,其方式与支持使用mmap()创建的私有匿名映射的内存大致相同。事实上,对于大型分配,malloc()会创建一个匿名映射,mmap()无论如何都会支持它,因此您不可能通过自己明确使用mmap()来看到很多差异。

在一天结束时,如果您的工作集超过了物理内存大小,那么您将需要使用swap,以及您是否使用使用mmap()malloc()创建的匿名映射不会改变这一点。你可以做的最好的事情是尝试重构你的算法,使其具有良好的locality of reference,这将减少交换伤害你的程度。

您还可以尝试通过madvise()系统调用向内核提供有关内存使用情况的一些提示。

答案 1 :(得分:2)

这里的关键区别在于,对于malloc(3) - 输入缓冲区,您要求内核复制来自已经在内存中的文件映射页面中的数据,而使用{{1你只是使用那些页面。第一种方法是备份内核缓冲区和内核缓冲区所需的物理内存量翻倍,而第二种方法共享该物理内存,只增加了用户进程的虚拟映射数量。