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

时间:2013-02-13 14:54:55

标签: mmap

我有一个常规使用海量数组的程序,其中使用mmap

分配内存

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

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

1 个答案:

答案 0 :(得分:3)

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

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

  1. 寻找可以保存映射的免费地址范围

  2. 在地址空间中创建/放大vma结构(mm_struct

  3. 因此,分配大量内存使用mmap不要引入更多内存 比小的开销。

    所以你应该每次都尽可能地分配更大的内存。 (避免多次出现小mmap

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

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

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

    在这种情况下,您应该始终尝试重复使用大型数组而不是munmapmmap(避免网页故障)