使用mmap保留地址空间的开销

问题描述 投票:2回答:1

我有一个程序,经常使用大规模数组,其中内存使用mmap分配

有没有人知道在提交内存之前大量分配地址空间的典型开销,无论是使用MAP_NORESERVE进行分配还是使用稀疏文件备份空间? It5打击我mmap不能免费,因为它必须为分配的空间制作页表条目。在实现我正在考虑的算法之前,我想知道这个开销。

显然答案将取决于平台,我最感兴趣的是x64 linux,sparc solaris和sparc linux。我认为1mb页面的可用性使sparc上的开销比x64少得多。

mmap
1个回答
3
投票

mmap的开销取决于你使用它的方式。当您以适当的方式使用它时,它通常可以忽略不计。

在linux内核中,mmap操作可以分为两部分:

  1. 寻找可以保存映射的空闲地址范围
  2. 在地址空间中创建/放大vma结构(mm_struct

所以分配大量的内存使用mmap不会引入比小的开销更多的开销。

所以你应该在每次分配尽可能大的内存。 (避免多次小qazxsw poi)

并且您可以明确地提供起始地址(如果可能)。这可以在内核中节省一些时间来寻找足够大的可用空间。

如果您的应用程序是一个多线程程序。你应该避免同时调用mmap。这是因为地址空间受读写器锁保护,并且mmap始终采用写入器锁。在这种情况下,mmap延迟将更高。

而且,mmap只创建映射而不是页表。触摸时页面在页面错误处理程序中分配。页面错误处理程序将采用保护地址空间的读取器锁定,并且还可以影响mmap性能。

在这种情况下,你应该总是尝试重新使用你的大数组而不是mmapmunmap。 (避免页面错误)

© www.soinside.com 2019 - 2024. All rights reserved.