所謂的物件記憶體池技術設計過程如下:
首先為某種物件預先生成若干個空閒物件
,並且使用物件管理類進行管理。應用程式在需要使用此物件時,即向管理物件申請空閒物件.管理物件即檢視物件記憶體池,如果發現存在未使用空閒物件,即分配給申請者。如果發現已無空閒物件,可自行擴充物件記憶體池,並且滿足申請物件的需求,也可以直接返回null,表明物件申請失敗。在程式獲取物件並且使用後,想釋放此物件資源時。繼續想管理物件提出申請釋放物件,管理物件接受到釋放物件後將其再次放入物件池,成為可使用物件。
看了上面的介紹後,接下來以偽**的方式來更加清晰的展現物件獲取和釋放的過程。
申請物件
obj* {
if 存在空閒物件
{obj *pidleobj = null;
pidleobj = getidleobj(); //獲取空閒物件
return
pidleobj;
}//不存在空閒物件,處理方式如下
方式1:
extendobjectpool(); //擴充物件池
obj *pidleobj = null;
pidleobj = getidleobj(); //獲取空閒物件
return
pidleobj;
方法2:
return
null;
}釋放物件
void
releaseobj(obj* pobj) {
if(pobj!=null)
{addtoobjectpool(pobj); //物件再次加入到物件池 }
}有了上面的這些說明,我想大家對於物件記憶體池技術應該都有了乙個大概了解吧!
(其實沒有什麼高深的技術,只是一些簡單的應用,大家用乙個平常心來看待就可以了!)接下介紹具體來實現這個物件記憶體池,我們需要做些什麼?
在實現物件記憶體池之前,先提出幾個我們需要達到的目標:
u 物件記憶體池管理物件具有廣泛的通用性,也就是說能夠滿足應用程式生成各個不同的物件池,例如:p
layer物件池、monster物件池、npc物件池。
u 產生物件的速度一定要快於直接使用
new/delete或者malloc/free方式很多倍。
u 物件池容量具有可擴充套件性和糾錯能力。也就是說在無空閒物件時,管理物件類能夠自動生成一批新的空閒物件供上層使用,同時能夠正確指出目前所使用物件是否為合法物件池物件。
u 物件的申請和釋放,必須具備多執行緒安全性。也就是說在伺服器程式通過各個不同執行緒同時訪問物件池管理時,能夠保證合法獲取和釋放池物件。
)解決方案1:(單鏈表實現)u
第一步,分配模板物件陣列,並且用指標儲存。
u 第二步,建立一單鏈表管理類,將已經分配成功的陣列物件,分配到單鍊錶中,同時設定表頭和表尾指標。
u 第三步,從物件池中申請物件,首先檢測鍊錶中是否存在可使用空閒物件。如果沒有可返回
null,也可以先鎖定擴充鍊錶(儲存擴充套件物件陣列指標)。然後返回可使用物件給使用者。
u 第四步,釋放物件池物件時,首先將表尾指標指向被釋放物件,接下來被**物件為此煉表表尾。完成釋放過程。
u 最後,記憶體釋放,
delete陣列指標。
圖例演示如下:
解決方案2:(雙鏈表實現)u
為了能夠使我們建立的物件池能夠在應用程式中通用,我們考慮使用模板
template來生成我們的class cobjectpool.
u 為了能夠快速獲取物件,我們採用雙向鍊錶的方式來建立我們的物件池。物件獲取從當前煉表頭開始進行,物件釋放直接加到鍊錶尾。操作過程中需要使用一附加指標物件表明當前可使用物件位置。若此指標為
null,表明已無可使用空閒物件。
u 為了生成乙個一定容量的物件池,我們可以通過模板的方式也可以通過初始化
init方式來生成初始物件池。在申請過程中無空閒物件,需要向系統重新一定數目物件,並且按照順序加到鍊錶尾。實現物件池的可擴充性。
u 為了保證多執行緒安全,我們在物件
記憶體池技術
經典的記憶體池技術 經典的記憶體池 mempool 技術,是一種用於分配大量大小相同的小物件的技術。通過該技術可以極大加快記憶體分配 釋放 過程。下面我們詳細解釋其中的奧妙。經典的記憶體池只涉及兩個常量 memblocksize itemsize 小物件的大小,但不能小於指標的大小,在32位平台也就...
記憶體池技術
記憶體池技術是一種飽受爭議的技術 爭議熱點在於到底有沒有必要自己實現。1.記憶體池技術出現在libc尚不成熟的時候,當時程式經常在執行一段時間後效能下降,當時維護記憶體池很有必要 2.現在64位伺服器經常是32g以上的記憶體,管理記憶體碎片意義不打 3.寫malloc的各位都是大神,自己寫有99 的...
記憶體池 MemPool 技術詳解 經典記憶體池
url align center b 概述 b align 記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運...