5

我目前正在調查在Windows下的malloc()實現。但在我的研究中,我偶然發現了讓我感到困惑的事情:Windows內存分配問題

首先,我知道在API級別,windows主要使用調用HeapAlloc()VirtualAlloc()來分配內存。我從here收集微軟實施malloc()(包括在CRT - C運行時)基本上呼籲HeapAlloc()> 480字節的塊,否則管理一個特殊的區域分配VirtualAlloc()小分配,以防止碎片。

那麼這一切都很好。但是接下來還有malloc()的其他實現,例如nedmalloc,聲稱比微軟的malloc快125%。

這一切都讓我不知道的幾件事情:

  1. 爲什麼我們不能只調用HeapAlloc()爲小塊?在分散性方面表現不佳(例如,通過「先做」而不是「最適合」)?

    • 其實,有沒有什麼辦法可以知道各種API分配調用的內幕?這會很有幫助。
  2. 是什麼讓比微軟的malloc更快nedmalloc這麼多?

  3. 從上面的,我得到的印象是HeapAlloc()/VirtualAlloc()是如此緩慢,它是malloc()快得多在一段時間只有一次打電話給他們,然後來管理分配的內存本身。這個假設是真的嗎?或者是malloc()「包裝」只是因爲碎片需要? 有人會認爲這樣的系統調用會很快 - 或者至少有一些想法會被加入到它們中,以提高效率。

    • 如果這是真的,爲什麼這樣呢?
  4. 平均來說,有多少內存(一個數量級)讀/寫是由一個典型的malloc調用(可能已經分配的段數的函數)來執行?我會直覺地說,這是一個普通節目的十幾歲,對嗎?

+0

另外,閱讀關於「dlmalloc」的內容對於malloc策略來說是非常豐富的。 – Will 2010-07-07 22:53:35

回答

5
  1. 調用HeapAlloc不健全跨平臺的。當他們希望時,MS可以自由地改變他們的實施;建議遠離。 :)
  2. 它可能更有效地使用內存池,很像Loki庫對其「小對象分配器」所做的操作。
  3. 通過任何實現總是很慢的堆分配通常很慢。分配器越「專業化」,速度越快。這使我們回到了第2點,它處理內存池(以及使用的特定於您的應用程序的分配大小)。
  4. 不知道。
+0

微軟也可以自由地改變事物,使一切都變得更好。請參閱轉換到低碎片堆。 – MSN 2010-07-07 22:52:28

+0

1.我也沒有期待它,因爲我在Windows上嘗試malloc實現目標。但問題依然存在:它是無效的,是分裂的嗎? 2.這意味着它可以更有效地管理指向空閒空間的指針,以便在內存中分配相應的塊更快?你知道我在哪裏可以讀到關於內存池的內容嗎? 正如用戶在上面提示的那樣,我開始使用dlmalloc(之前我已經詳細介紹了它,但它確實聽起來以unix爲導向,將它描述爲模仿unix調用的windows功能)。 – Norswap 2010-07-08 10:04:13

1

從上面的,我得到的印象是HeapAlloc()/的VirtualAlloc()是如此之慢,這是快得多的malloc(),以在一段時間打電話給他們只有一次,然後來管理分配記憶本身。這個假設是真的嗎?

OS級別的系統調用是爲管理整個進程內存空間而設計和優化的。使用它們爲整數分配4個字節實際上是不理想的 - 通過管理庫代碼中的微小分配,讓操作系統針對更大的分配進行優化,從而獲得總體上更好的性能和內存使用率。至少據我瞭解它。