記憶體池(mempool)技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost::pool元件與經典mempool的差異。同時也描述了mempool在sgi-stl/stlport中的運用。
經典的記憶體池(mempool)技術,是一種用於分配大量大小相同的小物件的技術。通過該技術可以極大加快記憶體分配/釋放過程。下面我們詳細解釋其中的奧妙。
經典的記憶體池只涉及兩個常量:memblocksize、itemsize(小物件的大小,但不能小於指標的大小,在32位平台也就是不能小於4位元組),以及兩個指標變數memblockheader、freenodeheader。開始,這兩個指標均為空。
class
mempool
;struct _memblock ;
_memblock
*m_pmemblockheader;
_freenode
*m_pfreenodeheader;
public
:mempool(
intnitemsize,
intnmemblocksize
=2048
): m_nitemsize(nitemsize), m_nmemblocksize(nmemblocksize),
m_pmemblockheader(null), m_pfreenodeheader(null)
};
其中指標變數memblockheader是把所有申請的記憶體塊(memblock)串成乙個鍊錶,以便通過它可以釋放所有申請的記憶體。freenodeheader變數則是把所有自由記憶體結點(freenode)串成乙個鏈。
這段話涉及兩個關鍵概念:
記憶體塊(memblock)和
自由記憶體結點(freenode)。記憶體塊 大小一般固定為memblocksize位元組(除去用以建立鍊錶的指標外)。記憶體塊在申請之初就被劃分為多個記憶體結點(node),每個node大小為 itemsize(小物件的大小),計memblocksize/itemsize個。這memblocksize/itemsize個記憶體結點剛開始全 部是自由的,他們被串成鍊錶。我們看看申請/釋放記憶體過程,就很容易明白這樣做的目的。
**如下:
void
*mempool::malloc()
//沒有引數
void
*pfreenode
=m_pfreenodeheader;
m_pfreenodeheader
=m_pfreenodeheader
->
pprev;
return
pfreenode;}
記憶體申請過程分為兩種情況:
**如下:
void
mempool::free(
void*p)
釋放過程極其簡單,只是把要釋放的結點掛到自由記憶體鍊錶(freenodelist)的開頭即可。
mempool技術申請記憶體/釋放記憶體均極其快(比
autofreealloc
慢)。其記憶體分配過程多數情況下複雜度為o(1),主要開銷在freenodelist為空需要生成新的memblock時。記憶體釋放過程複雜度為o(1)。
boost::pool是記憶體池技術的變種。主要的變化如下:
注意:不要認為boost提供ordered_free是多此一舉。後文我們會在討論boost::object_pool時解釋這一點。
sgi-stl把記憶體池(mempool)技術進行發揚光大,用它來實現其最根本的allocator。
其大體的思想是,建立32個mempool,<=4位元組的記憶體申請由0號mempool分配,<=8位元組的記憶體申請由1號mempool分配,以此類推。最後,>128位元組的記憶體申請由普通的malloc分配。
以上**屬於偽**(struct _freenode、_memblock編譯通不過),並且去除了出錯處理。
記憶體池 MemPool 技術詳解 經典記憶體池
url align center b 概述 b align 記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運...
記憶體池 MemPool 技術詳解
記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分配大量...
記憶體池 MemPool 技術詳解
記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分配大量...