記憶體池就是在程式啟動時,預先向堆中申請一部分記憶體,交給乙個管理物件。在程式執行中,需要時向管理物件「借」,不需要時「還」給管理物件。
原理很簡單,關鍵是怎樣才能高效地「借」、「還」。
在c/s伺服器中,需要頻繁地收發資料報。而資料報的記憶體採用原始的new-delete模式,會大大降低伺服器效能,所以想到了使用記憶體池技術。
在此例項中有幾個硬性條件:
1、資料報最大長度可預期,所以記憶體池中塊的大小暫且規定為1024。
2、記憶體池適用於多執行緒情況。也就是說,可以同時有多人「借」同乙個空閒塊。
一、記憶體存放結構
二、第一次「借」
遍歷記憶體池,發現塊1空閒(可以「借」出去)。標記塊1為「已藉」,記錄此時位置(1,1)。然後,把塊1「借出去」。
三、連續幾次「借」出,中途可能有幾次歸「還」
「借」的時候都是在上次「借」出的位置基礎上往後遍歷,運氣差會遍歷到末尾。當然,多執行緒嘛,中途可能有幾次歸還,對借出也沒干擾。歸還時,標記塊的狀態為「空閒」即可。狀態為bool值,在一讀一寫的情況下,不需要加鎖。怎麼說時一讀一寫呢?借的時候需要加鎖(一讀),借出後,只可能借到的人寫(一寫)。
四、遍歷到末尾了
在藉藉還還中,總會出現這種情況。當前位置(3,1),後邊的塊全部標記為「已藉」。很明顯,這樣會直接遍歷到末尾。後邊沒資料了,只有看看頭部到(3,1)這部分資料塊有空閒的沒。很幸運的是,遍歷到了(1,2)空閒。
五、沒有空閒的塊了
當從當前位置往後遍歷,沒有空閒塊。然後在從頭部遍歷到當前位置,依然沒有空閒塊。說明,該新增新的記憶體到記憶體池了。然後,直接返回剛申請記憶體的第一塊。
這只是眾多思路中的乙個。有瑕疵,卻想不出更好的辦法。麻煩的就是需要考慮多執行緒,有多執行緒就得加鎖,加鎖就是變相的單執行緒,就會影響效率。這裡我只給借記憶體加了鎖,還記憶體可以不加鎖。先嘗試這多寫幾個例項出來,比比哪種方法更高效。
這裡採用模版類,通用性更強。編譯通過了,但沒有使用過。
templatestruct sblock
;
#ifndef mempool_h
#define mempool_h
#include #include using namespace std;
templateclass mempool
~mempool() {}
bool init(unsigned int buffcount, unsigned int blockcount)
t* malloct()
}m_curblockindex = 0;
}//遍歷前方
int tempindex = m_curbuffindex;
for (m_curbuffindex = 0; m_curbuffindex < tempindex; ++m_curbuffindex)
}m_curblockindex = 0;
}//沒有空閒的記憶體塊,申請新記憶體
int tempsize = m_buffs.size();
addbuff();
m_curbuffindex = tempsize;
m_buffs[m_curbuffindex][m_curblockindex].flag = 1;
return m_buffs[m_curbuffindex][m_curblockindex];
}void freet(t* p)
private:
void addbuff()
}private:
vector*> m_buffs;
unsigned int m_curbuffindex; //當前正在使用的大記憶體索引
unsigned int m_curblockindex; //當前正在使用的塊索引
unsigned int m_basebuffcount; //大記憶體基數量,每次新增大記憶體數
unsigned int m_baseblockcount; //每乙個大記憶體包含多少個塊
mutex m_mt;
};#endif // mempool_h
記憶體池 簡單的記憶體池的實現
當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多 第二個問題是分配釋放記憶體花費的時間可能比較多 這個問題不太明顯 這個時候我們就可以考慮使用記憶體池了。最樸素的記憶體池思想就是,首先你向系統申請一塊很大的...
乙個簡單記憶體池實現
最近面試被問了乙個記憶體池的實現,關鍵是記憶體塊的組織,說來慚愧,由於之前沒有詳細去了解過實現,只記得作業系統上有說過空閒鍊錶的實現,即按分配的塊用鍊錶鏈結,有小塊優先,大塊優先等 後來回來認真地找了幾個記憶體池實現的技術介紹,多數是以乙個固定塊,每個塊又有固定長度的單元組成。參考了網上的一些實現方...
簡單的記憶體池實現
記憶體池是用來改善new delete記憶體管理機制可能造成的執行效率低下問題的一種技術 經典的記憶體池技術,是用一種用於分配大量大小相同的小物件技術,加快記憶體分配或者釋放的過程。在看書的過程中,我對簡單的實現乙個記憶體池的實現理解是 1 讓我們在堆上面申請到的記憶體是連續的。2 我們放在記憶體池...