2017-05-02 56 views
0

這個想法是寫一個內存管理器,一次分配一堆內存,以最大限度地減少malloc和免費調用,我試着寫我的自我兩次,但兩次我遇到對內存進行碎片整理的問題。寫一個內存管理器和碎片整理內存

您可以每隔一段時間檢查一次塊是否爲空,如果它是空的,則刪除它。但假設你的塊是100個字節,首先分配20個字節的內存,這將創建一個新的100字節塊,因爲沒有塊存在,然後分配80個字節並填充第一個塊,然後再分配20個字節這將創建另一個新塊,因爲第一個塊已滿,然後釋放第二個分配(80個字節),併爲您留下兩個只使用前20個字節的塊,這意味着您已分配了100個字節通過將第二個塊的20個字節移動到第一個塊並刪除第二個塊來釋放。

這是我遇到的問題:

  1. 你不能左右移動存儲,因爲這意味着所有的指針到內存就必須更新,要做到這一點,你需要知道他們的地址,你不知道;
  2. 100字節是一個非常小的塊大小,如果我想要在內存中存儲非常低分辨率(64,64)的ARGB圖像呢?這將使用16KB的內存,並且移動所有內存甚至可能比根本不寫內存管理器要慢。

它甚至值得寫畢竟,一個自定義的內存管理器?

+0

看看好友系統 - https://en.wikipedia.org/wiki/Buddy_memory_allocation –

+3

你有*實際*性能問題,你需要解決?如果沒有,那麼我會說這是過早的優化。 –

+5

大多數常用的malloc/free實現都是由具有豐富經驗的程序員編寫的,他們對問題領域有深入的瞭解,並隨着時間的推移考慮到實際使用中發現的任何缺陷。這並不意味着它們是最好的實現,但它表明你不可能在第一次嘗試時做得更好。 – rici

回答

0

畢竟它是否值得編寫自定義內存管理器?

這是徵求意見,但我會盡量給出一個事實答案。

隨大多數操作系統和語言支持庫一起提供的內存分配器通常質量非常高,旨在解決您遇到的各種問題(碎片和性能)以及其他問題。它們大致與通用內存分配器一樣可以。

如果您的應用程序具有可被利用的特定分配模式,則可以比提供的內存分配器做得更好(稍微)。這很少見,但通常你可以利用它比通用內存管理器更簡單。

你不能移動內存周圍

真。大多數現代系統甚至不嘗試移動內存 - 他們嘗試避免碎片開始(通常通過聚類相似大小的分配)。

舊系統(沒有虛擬內存管理器的系統)有時會使用具有額外間接層的內存管理器。分配器不會返回指向已分配內存的指針,而是返回一個「句柄」,該句柄可能與內存管理器維護的表中的索引一樣簡單。當用戶想要實際訪問內存時,他們會「鎖定」它。內存管理器可以自由移動未被鎖定的內存(例如,爲了消除碎片),因爲這些處理提供了額外的間接級別。

如果我想存儲一個非常低分辨率(64,64)ARGB圖像

大多數內存管理器提供了多種尺寸如此大的分配不會跨越n爲分裂的小塊。大多數情況下都會給系統分配器分配非常大的分配,在虛擬內存操作系統上,通常可以解決問題,除非進程地址空間過於分散。