記憶體池技術

2021-06-09 22:42:38 字數 1181 閱讀 6480

經典的記憶體池技術

經典的記憶體池(mempool)技術,是一種用於分配大量大小相同的小物件的技術。通過該技術可以極大加快記憶體分配/釋放

過程。下面我們詳細解釋其中的奧妙。

經典的記憶體池只涉及兩個常量:memblocksize、itemsize(小物件的大小,但不能小於指標的大小,在32位平台也就是不

能小於4位元組),以及兩個指標變數memblockheader、freenodeheader。開始,這兩個指標均為空

class mempool

;struct _memblock ;

_memblock* m_pmemblockheader;//memblockheader是把所有申請的記憶體塊(memblock)串成乙個鍊錶

_freenode* m_pfreenodeheader;//freenodeheader變數則是把所有自由記憶體結點(freenode)串成乙個鏈

public:

mempool(int nitemsize, int nmemblocksize = 2048)

: m_nitemsize(nitemsize), m_nmemblocksize(nmemblocksize),

m_pmemblockheader(null), m_pfreenodeheader(null)

};1.void* mempool::malloc()    // 沒有引數

2.14.    void* pfreenode = m_pfreenodeheader; //將一塊記憶體區域劃分出去,再移動頭指標

15.    m_pfreenodeheader = m_pfreenodeheader->pprev;

16.    return pfreenode;

17.}

記憶體申請過程分為兩種情況:

·            在自由記憶體結點鍊錶(freenodelist)非空。

在此情況下,alloc過程只是從鍊錶中摘下乙個結點的過程。

·            否則,意味著需要乙個新的記憶體塊(memblock)。

這個過程需要將新申請的memblock切割成多個node,並把它們串起來。

mempool技術的開銷主要在這。

1.void mempool::free(void* p)

2.釋放過程極其簡單,只是把要釋放的結點掛到自由記憶體鍊錶(freenodelist)的開頭即可。

記憶體池技術

記憶體池技術是一種飽受爭議的技術 爭議熱點在於到底有沒有必要自己實現。1.記憶體池技術出現在libc尚不成熟的時候,當時程式經常在執行一段時間後效能下降,當時維護記憶體池很有必要 2.現在64位伺服器經常是32g以上的記憶體,管理記憶體碎片意義不打 3.寫malloc的各位都是大神,自己寫有99 的...

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

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

物件記憶體池技術

所謂的物件記憶體池技術設計過程如下 首先為某種物件預先生成若干個空閒物件 並且使用物件管理類進行管理。應用程式在需要使用此物件時,即向管理物件申請空閒物件.管理物件即檢視物件記憶體池,如果發現存在未使用空閒物件,即分配給申請者。如果發現已無空閒物件,可自行擴充物件記憶體池,並且滿足申請物件的需求,也...