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

Advantages of anonymous mmap over malloc under memory pressure

本文关键字:malloc 优于 mmap 内存 压力      更新时间:2023-10-16

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

如果有,请解释一下原因。

在我的浅显理解中,mmap实现了一个从tmpfs分区挂载的内存映射文件,该文件在内存压力下会回落到交换机制。我想了解的是mmap如何比标准malloc做得更好(为了论证的缘故,我假设它确实更好,我不知道它是否如此)。

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

支持malloc()分配的内存由内核以与支持mmap()创建的私有匿名映射的内存大致相同的方式处理。事实上,对于大型分配,malloc()将创建一个与mmap()的匿名映射来支持它,因此您不太可能通过显式地使用mmap()来看到太大的区别。

在一天结束时,如果您的工作集超过了物理内存大小,那么您将需要使用swap,并且无论您使用mmap()还是malloc()创建的匿名映射都不会改变这一点。您能做的最好的事情是尝试重构您的算法,使其具有良好的引用局部性,这将减少交换对您的伤害程度。

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

这里的关键区别在于,使用malloc(3) -ed输入缓冲区时,您要求内核从已经存在于内存中的文件映射页面复制数据,而使用mmap(2)时,您只需使用这些页面。第一种方法将备份您的和内核内缓冲区所需的物理内存量增加一倍,而第二种方法共享物理内存,并且只增加useland进程的虚拟映射数量。