2012-01-15 44 views
20

使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配內存比使用malloc有什麼缺點?對於功能範圍的數據,我想無論如何,因此使用的堆棧內存不malloc.想到的如果我使用mmap而不是malloc分配內存,該怎麼辦?

一個缺點是動態的數據結構,例如樹和鏈表,在那裏你經常需要分配和釋放的小型數據塊。使用mmap由於兩個原因將會是昂貴的,一個是以4096字節的粒度進行分配,另一個是需要進行系統調用。

但在其他情況下,您認爲mallocmmap更好嗎?其次,我是否高估了動態數據結構mmap的劣勢?

mmap超過malloc我能想到的一個優勢是,內存被立即返回到操作系統,當你做munmap,而與malloc/free,我猜內存uptil數據段斷點是永遠不會回來了,但存放回用。

+9

如果需要,malloc會爲你調用mmap ...只需要堅持malloc。 – Macmade 2012-01-15 13:33:59

+2

另一個缺點是,如果你使用'mmap'調用你的代碼,它就變得不便攜了。 – 2012-01-15 13:35:02

+3

爲什麼讓生活比它需要更復雜? – 2012-01-15 13:37:56

回答

26

是的,mallocmmap好。它使用起來更容易,更精細,更便於攜帶。最後,無論如何它都會打電話給mmap

如果你開始每天做內存管理與mmap,你要實現比網頁更小的塊parceling出來的一些方式,你將最終重新實現malloc - 次優的方式,大概。

+1

因爲它提到'malloc'調用'mmap',因此深入解答。 – 2016-09-01 09:04:07

17

首先,mmap()是一個平臺特定的結構,所以如果你打算編寫便攜式C,它已經不在了。

其次,malloc()基本上在mmap()方面實現的,但它是一種圍繞着系統調用智能庫包裝的:在需要的時候它就會從系統請求新的內存,但在那之前它會挑一塊記憶一個已經投入到這個過程中的領域。

因此,如果你想做普通的動態內存分配,請使用malloc(),故事結束。使用mmap()進行內存分配時,應該保留用於特殊情況(例如,如果實際上需要整個頁面,在頁面邊界對齊),並且始終將其抽象爲單個庫代碼,以便其他人可以輕鬆理解您的內容,重新做。

+1

即使你確實想爲你自己創建一個完整的頁面,那麼最好使用'posix_memalign',它可以更快地分配,更快地釋放,並且將內核從跟蹤另一個vma的麻煩中解放出來。真正使用'mmap'的唯一理由是如果你想將一個文件描述符映射到內存中(最常見的用法),或者正在實現一個內存分配器(即使這樣也有很好的理由選擇'sbrk')。 – jleahy 2013-05-14 20:27:48

3

一個功能,mmapmalloc不,是mmap允許您使用大頁面分配(標誌參數具有MAP_HUGETLB集),而malloc沒有這樣的選擇。