2012-10-29 199 views
3

我正在使用mmap()將共享內存對象映射到進程。我的問題有兩個部分:什麼是mmap的大小限制

1)mmap()到linux進程的大小限制是多少? (是否有這樣的限制?)

2)過程運行一段時間後,我認爲進程虛擬內存地址空間會有些碎片化。這會影響我在此過程中可以執行的最大尺寸mmap()嗎?

使用的linux內核是2.6.27。共享內存對象的大小約爲32MB。我試圖訪問mmap()由於沒有足夠的虛擬地址空間而導致這種共享內存對象失敗的可能性。

+0

您唯一應該關注的問題應該是系統內存非常小,或者沒有PAE的32位系統,其中你的應用程序佔用了大量的虛擬內存,除此之外我相信這個數字很低。如果你可以提供一些關於你的應用程序內存使用情況的更多細節,這將有助於。 –

+1

實際上,在程序文本,數據,堆,堆棧,所有共享庫及其文本/數據/堆,內核和任何其他種類的「通常」映射之後,該限制是當前未分配的地址空間的最大範圍... – twalberg

+0

@twalberg是的,那是真的。我想知道在虛擬內存空間的所有通常會計之後,剩餘空間的大小是多少。特別是在應用程序運行很長一段時間後它會如何變化。 CPU是32位Intel CPU。我相信它有PAE。 – user1783732

回答

1

mmap大小沒有限制,但取決於給定進程使用的現有地址空間。但是強烈建議你不要將mmap設置爲大的連續虛擬地址空間。另一個建議是在訪問特定物理地址(或設備地址)時使用「即時」mmap,並且一旦完成取消映射

相關問題