我正在运行一些大型数组处理代码(在运行Linux的奔腾上)。数组的大小足以供进程交换。到目前为止,它是有效的,可能是因为我试图保持我的读写是连续的。但是,我很快就需要处理更大的数组。在这种情况下,切换到匿名的mmapped块会有帮助吗?
如果是的话,请你解释一下原因。
在我的粗浅理解中,mmap实现了一个从tmpfs分区挂载的内存映射文件,在内存压力下,它将回退到交换机制。我想要了解的是mmap如何比标准malloc做得更好(出于原因或争论,我假设它确实更好,我不知道是不是这样)。
注意:请不要建议使用64位或更多的RAM。不幸的是,这不是一种选择。
发布于 2011-11-25 08:02:58
内核对支持malloc()分配的内存的处理方式与支持使用mmap()创建的私有匿名映射的内存非常相似。事实上,对于较大的分配,malloc()无论如何都会使用mmap()创建一个匿名映射来支持它,所以您自己显式使用mmap()不太可能看到太大的区别。
归根结底,如果您的工作集超过了物理内存大小,那么您将需要使用交换,并且无论您使用使用mmap()还是malloc()创建的匿名映射,都不会改变这一点。你能做的最好的事情就是尝试重构你的算法,使其具有良好的locality of reference,这将减少交换对你的伤害程度。
您还可以尝试通过madvise()系统调用向内核提供一些关于内存使用情况的提示。
发布于 2011-11-25 07:38:53
这里的关键区别在于,对于malloc(3)-ed输入缓冲区,您要求内核从已在内存中的文件映射页面复制数据,而对于mmap(2),您只需使用这些页面。第一种方法将备份和内核缓冲区所需的物理内存量增加了一倍,而第二种方法共享物理内存,并且只增加了useland进程的虚拟映射数量。
https://stackoverflow.com/questions/8263469
复制相似问题