我有一个常规使用海量数组的程序,其中使用mmap
有人知道在提交内存之前大量分配地址空间的典型开销,无论是使用MAP_NORESERVE
分配还是使用稀疏文件备份空间? It5打击我mmap不能免费,因为它必须为分配的空间制作页表条目。在实现我正在考虑的算法之前,我想知道这个开销。
显然,答案将取决于平台,我对x64 linux,sparc solaris和sparc linux最感兴趣。我认为1mb页面的可用性使sparc上的开销比x64少得多。
答案 0 :(得分:3)
mmap
的开销取决于您使用它的方式。当你以适当的方式使用它时,它通常可以忽略不计。
在linux内核中,mmap
操作可以分为两部分:
寻找可以保存映射的免费地址范围
在地址空间中创建/放大vma结构(mm_struct
)
因此,分配大量内存使用mmap
不要引入更多内存
比小的开销。
所以你应该每次都尽可能地分配更大的内存。 (避免多次出现小mmap
)
您可以明确提供起始地址(如果可能)。这可以在内核中节省一些时间来寻找足够大的可用空间。
如果您的应用程序是多线程程序。 您应避免同时拨打mmap
。这是因为地址空间受读写器锁保护,并且mmap始终采用写入器锁。在这种情况下,mmap
延迟会更高。
此外,mmap
仅创建映射,但不创建页表。触摸时页面在页面错误处理程序中分配。页面错误处理程序将采用保护地址空间的读取器锁定,并且还会影响mmap
性能。
在这种情况下,您应该始终尝试重复使用大型数组而不是munmap
和mmap
。(避免网页故障)