天天看點

阿裡面試官問我記憶體池Memory Pool是什麼,以為我不知道,其實我都懂!一個簡單的實踐示例記憶體池與 malloc 的比較

在翻閱 Java 程式設計思想英文原版時,讀到了 pool of memory一詞,而 Java 的堆内容就屬于記憶體池。

記憶體池(Memory Pool),又被稱為固定大小區塊規劃(fixed-size-blocks allocation),允許程式員以類似 C語言 的 malloc 或是 C++ 的 new 操作數進行動态的存儲器規劃。對于其它動态存儲器規劃的實踐來說,因為會變動存儲器區塊大小導緻的碎片問題,導緻在實時系統上受限于性能是以,根本無法使用。記憶體池提供了一個更有效率的解決方案:預先規劃一定數量的存儲器區塊,使得整個程式可以在運作期規劃 (allocate)、使用 (access)、歸還 (free) 存儲器區塊。

一個簡單的實踐示例

這個簡單的記憶體池實踐子產品在編譯期規劃 3 個示例記憶體池,其區塊将大小針對程式的需求做最優化。

這個程式可以下列接口來規劃、使用及歸還存儲器區塊:

從記憶體池中規劃存儲器區塊。這個函數會先檢測目前的記憶體池是否仍有足夠空間可以規劃所需的存儲器區塊,若空間已不足,将繼續嘗試下一個記憶體池。一個已規劃的存儲器區塊将使用handle來表示

擷取一個指向已規劃存儲器區塊的指針

歸還之前規劃的存儲器區塊

用以代表存儲器區塊的handle,可以使用像是 unsigned int 的資料類型來實踐。

記憶體池與 malloc 的比較

優點

記憶體池允許在運作期以常量時間規劃存儲器區塊,并且不會有存儲器破碎的情況産生。一次歸還存儲器中成千上萬個對象的存儲器區塊隻需要一個操作,無需像 malloc 一般需要個别 free。

記憶體池可以在層次結構式的樹狀結構中被分群,非常适合某些特定的程式結構,例如遞歸與疊代。

固定區塊大小的記憶體池不需将每次規劃的資訊記錄下來(例如規劃的存儲器區塊大小,因為每次規劃都是一樣的)。針對一些小而多的存儲器區塊規劃會節省一些空間。

缺點

記憶體池子產品在使用時,必須依照程式需求來做個别調整,才能保持時間與空間效率。