記憶體池 MemPool 技術詳解

2021-04-16 08:01:33 字數 1945 閱讀 1845

記憶體池(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。

其大體的思想是,建立16個mempool,<=8位元組的記憶體申請由0號mempool分配,<=16位元組的記憶體申請由1號mempool分配,<=24位元組的記憶體有2號mempool分配,以此類推。最後,>128位元組的記憶體申請由普通的malloc分配。

以上**屬於偽**(struct _freenode、_memblock編譯通不過),並且去除了出錯處理。

記憶體池 MemPool 技術詳解

記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分配大量...

記憶體池 MemPool 技術詳解

概述 記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分...

記憶體池 MemPool 技術詳解 經典記憶體池

url align center b 概述 b align 記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運...