2

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

有谁知道在提交内存之前大量分配地址空间的典型开销,无论是使用稀疏文件分配MAP_NORESERVE空间还是使用稀疏文件支持空间?It5 让我印象深刻,mmap 不能免费,因为它必须为分配的空间创建页表条目。在实现我正在考虑的算法之前,我想对这种开销有所了解。

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

4

1 回答 1

4

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

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

  1. 寻找可以保存映射的空闲地址范围

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

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

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

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

如果您的应用程序是多线程程序。您应该避免同时调用mmap. 那是因为地址空间受到读写锁的保护,而 mmap 总是使用写锁。mmap在这种情况下,延迟将大几个数量级。

此外,mmap只创建映射而不创建页表。页面被触摸时在页面错误处理程序中分配。页面错误处理程序将获取保护地址空间的读卡器锁,也会影响mmap性能。

在这种情况下,您应该始终尝试重用您的大数组,而不是一次又一次地重用munmapmmap(避免页面错误)

于 2013-05-23T03:43:57.960 回答