(1)最簡單的固定大小緩衝池
適用於頻繁分配和釋放固定大小物件的情況, 關於這個記憶體池,我這裡總結過:
乙個高效的記憶體池實現
(2)dlmalloc
關於dlmalloc的
內部原理和使用資料可以參考:
記憶體分配器dlmalloc 2.8.3原始碼**.doc
(3)sgi stl 中的記憶體分配器( allocator )
sgi stl 的 allocator 應該是目前設計最優秀的 c++ 記憶體分配器之一了,它的運作原理候捷老師在《 stl 原始碼剖析》裡講解得非常清楚。基本思路是設計乙個 free_list[16] 陣列,負責管理從 8 bytes 到 128 bytes 不同大小的記憶體塊( chunk ),每乙個記憶體塊都由連續的固定大小( fixed size block )的很多 chunk 組成,並用指標鍊錶串接起來。比如說
free_list[3]->start_notuse->next_notuse->next_notuse->...->end_notuse;
當使用者要獲取此大小的記憶體時,就在 free_list 的鍊錶找乙個最近的 free chunk 回傳給使用者,同時將此 chunk 從 free_list 裡刪除,即把此 chunk 前後 chunk 指標鏈結起來。使用者使用完釋放的時候,則把此chunk 放回到 free_list 中,應該是放到最前面的 start_free 的位置。這樣經過若干次 allocator 和 deallocator 後, free_list 中的鍊錶可能並不像初始的時候那麼是 chunk 按記憶體分布位置依次鏈結的。假如free_list 中不夠時, allocator 會自動再分配一塊新的較大的記憶體區塊來加入到 free_list 鍊錶中。
可以自動管理多種不同大小記憶體塊並可以自動增長的記憶體池,這是 sgi stl 分配器設計的特點。
(4) loki 中的小物件分配器( small object allocator )
loki
的分配器與
sgi stl
的原理類似,不同之處是它管理
free_list
不是固定大小的陣列,而是用乙個
vector
來實現,因此可以使用者指定
fixed size block
的大小,不像
sgi stl
是固定最大
128 bytes
的。另外它管理
free chunks
的方式也不太一樣,
loki
是由一列記錄了
free block
位置等資訊的
chunk
類的鍊錶來維護的,
free blocks
則是分布在另外乙個連續的大記憶體區間中。而且
free chunks
也可以根據使用情況自動增長和減少合適的數目,避免記憶體分配得過多或者過少。
(5) boost 的 object_pool
boost
中的object_pool
也是乙個可以根據使用者具體應用類的大小來分配記憶體塊的,也是通過維護乙個
free nodes
的鍊錶來管理的。可以自動增加
nodes
塊,初始是
32 個
nodes
,每次增加都以兩倍數向
system heap
要記憶體塊。
object_pool
管理的記憶體塊需要在其物件銷毀的時候才返還給
system heap
。(6)ace 中的 ace_cached_allocator 和
ace_free_list
ace 框架中也有乙個可以維護固定大小的記憶體塊的分配器,原理與上面講的記憶體池都差不多。它是通過在 ace_cached_allocator 中定義個 free_list 鍊錶來管理乙個連續的大記憶體塊的,裡面包含很多小的固定大小的未使用的區塊( free chunk ),同時還使用 ace_unbounded_set 維護乙個已使用的 chuncks ,管理方式與上面講的記憶體池類似。也可以指定 chunks 的數目,也可以自動增長,定義大致如下所示:
template<
class t>
class ace_cached_allocator :
public ace_new_allocator;
(7)tcmalloc
google的開源專案gperftools, 主頁在這裡:該記憶體池也被大家廣泛好評,並且在google的各種開源專案中被使用, 比如webkit就用到了它。
常見C 記憶體池技術
總結下常見的c 記憶體池,以備以後查詢。應該說沒有乙個記憶體池適合所有的情況,根據不同的需求選擇正確的記憶體池才是正道.1 最簡單的固定大小緩衝池 適用於頻繁分配和釋放固定大小物件的情況,關於這個記憶體池,我這裡總結過 乙個高效的記憶體池實現 2 dlmalloc 關於dlmalloc的 內部原理和...
記憶體池技術
經典的記憶體池技術 經典的記憶體池 mempool 技術,是一種用於分配大量大小相同的小物件的技術。通過該技術可以極大加快記憶體分配 釋放 過程。下面我們詳細解釋其中的奧妙。經典的記憶體池只涉及兩個常量 memblocksize itemsize 小物件的大小,但不能小於指標的大小,在32位平台也就...
記憶體池技術
記憶體池技術是一種飽受爭議的技術 爭議熱點在於到底有沒有必要自己實現。1.記憶體池技術出現在libc尚不成熟的時候,當時程式經常在執行一段時間後效能下降,當時維護記憶體池很有必要 2.現在64位伺服器經常是32g以上的記憶體,管理記憶體碎片意義不打 3.寫malloc的各位都是大神,自己寫有99 的...