首页 文章

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

提问于
浏览
5

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

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

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

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

2 回答

  • 2

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

  • 15

    支持 malloc() 分配的内存由内核处理,其方式与支持使用 mmap() 创建的私有匿名映射的内存大致相同 . 事实上,对于大型分配 malloc() 将创建一个匿名映射,使用 mmap() 来支持它,所以你不太可能通过自己明确地使用_505325来看到很多差异 .

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

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

相关问题