2013-02-13 75 views
2

我有經常使用大量的陣列,其中存儲器使用mmap開銷使用mmap

有誰知道內存在提交之前大量分配的地址空間的典型費用分配的節目預約地址空間,要麼使用MAP_NORESERVE進行分配,要麼使用稀疏文件備份空間? It5讓我震驚mmap不能自由,因爲它必須爲分配的空間創建頁表條目。在實現我正在考慮的算法之前,我想知道這個開銷。

很明顯,答案將取決於平臺,我最感興趣的是x64 linux,sparc solaris和sparc linux。我認爲1mb頁面的可用性使得sparc的開銷小於x64。

+0

我根本不用擔心這些開銷。這聽起來像[不成熟的優化](http://programmers.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil)。 – Celada 2013-02-14 01:29:23

回答

2

mmap的開銷取決於您使用它的方式。當你以適當的方式使用它時,它通常是微不足道的。

Linux內核,mmap操作可以分爲兩個部分:

  1. 尋找能保持映射

  2. 創建/擴大在地址空間VMA結構空閒地址範圍(mm_struct

因此分配大量內存使用mmap不要引入更多 比小的開銷。

所以你應該在每次分配內存儘可能大。 (避免多次小mmap

你可以明確地提供開始地址(如果可能的話)。這可以節省一些時間在內核中尋找足夠大的可用空間。

如果您的應用程序是一個多線程程序。 您應該避免同時撥打mmap。這是因爲地址空間受讀寫器鎖定保護,並且mmap始終採用寫入器鎖定。在這種情況下,延遲將會增加數量級。

此外,mmap只創建映射但不是頁表。頁面在觸摸時分配在頁面錯誤處理程序中。頁面錯誤處理程序將採用讀卡器鎖定來保護地址空間,並且還可能影響mmap的性能。

在這種情況下,您應該總是嘗試重新使用您的大數組而不是munmap it和mmap(避免頁面錯誤)