首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存压力下匿名mmap相对于malloc的优势

内存压力下匿名mmap相对于malloc的优势
EN

Stack Overflow用户
提问于 2011-11-25 07:30:44
回答 2查看 6.3K关注 0票数 5

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

如果是的话,请你解释一下原因。

在我的粗浅理解中,mmap实现了一个从tmpfs分区挂载的内存映射文件,在内存压力下,它将回退到交换机制。我想要了解的是mmap如何比标准malloc做得更好(出于原因或争论,我假设它确实更好,我不知道是不是这样)。

注意:请不要建议使用64位或更多的RAM。不幸的是,这不是一种选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-25 08:02:58

内核对支持malloc()分配的内存的处理方式与支持使用mmap()创建的私有匿名映射的内存非常相似。事实上,对于较大的分配,malloc()无论如何都会使用mmap()创建一个匿名映射来支持它,所以您自己显式使用mmap()不太可能看到太大的区别。

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

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

票数 15
EN

Stack Overflow用户

发布于 2011-11-25 07:38:53

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8263469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档