匿名映射在内存压力下相比malloc的优势

6
我正在运行一些大型数组处理代码(在运行Linux的Pentium上)。 数组的大小足够大,以至于进程需要交换。 到目前为止,它仍在工作,可能是因为我尝试保持读取和写入的连续性。 然而,我很快将需要处理更大的数组。 在这种情况下,切换到匿名mmapped块是否有帮助?
如果有,请解释为什么。
在我的浅薄理解中,mmap实现了从tmpfs分区挂载的内存映射文件,该分区在内存压力下会回退到交换机制。 我想了解的是,mmap如何比标准malloc更好(为了论证的目的,我假设它确实更好,我不知道它是否如此)。
注意:请不要建议获取64位和更多RAM。 不幸的是,那不是一个选项。

我建议切换到……啊算了。等猫叫吧。另外,要进行性能分析。我不预见会有什么差别,但根据您的使用模式可能会有所不同。 - sehe
@mitch wheat,mmaped接口未实现。在实现之前,我想知道它是否有更好的实现机会以及为什么。 - san
2个回答

15

malloc()分配的内存是由内核处理的,其方式与使用mmap()创建的私有匿名映射所支持的内存相同。实际上,对于大量的分配,malloc()会使用mmap()创建一个匿名映射来支持它,因此你使用mmap()自己分配内存也不太可能产生太大差异。

最终,如果你的工作集超过了物理内存大小,则需要使用交换,无论你使用mmap()创建的匿名映射还是malloc()都不会改变这一点。最好的方法是尝试重构算法,使其具有良好的引用局部性,这将减少交换对你的影响。

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


谢谢,我可以正确地假设内核的交换机制比映射基于磁盘的文件更好吗? - san
4
内核用于将脏页写入基于文件映射或基于交换空间映射的机制实际上非常密切相关。使用基于文件映射的优点在于可以将文件放置在比交换空间更快的设备上。 - caf

2

这里的关键区别在于,使用malloc(3)分配的输入缓冲区会要求内核从已经在内存中的文件映射页面复制数据,而使用mmap(2)则只需使用这些页面。第一种方法需要双倍的物理内存来支持你和内核缓冲区,而第二种方法共享了物理内存,并且只增加了用户空间进程的虚拟映射数量。


4
这是针对内存映射文件的。OP特别提到无名称的内存映射(即没有任何备份文件)。这里不涉及零拷贝路径。 - sehe
谢谢。当malloc内部使用内存映射文件时,是否总是这种情况?我没有接受过计算机科学的培训,所以这些可能是非常基本的问题。而且使用匿名mmap时,没有磁盘文件映射,对吗?只是将RAM区域赋予文件接口,并使用该文件接口进行文件映射。 - san
是的,我错过了“匿名”限定符。对于那种情况,请参见@caf的答案。我的答案适用于文件的内存映射部分。 - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接