記憶體池簡單實現(一)

2021-08-22 11:47:56 字數 2544 閱讀 4894

記憶體池就是在程式啟動時,預先向堆中申請一部分記憶體,交給乙個管理物件。在程式執行中,需要時向管理物件「借」,不需要時「還」給管理物件。

原理很簡單,關鍵是怎樣才能高效地「借」、「還」。

在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 我們放在記憶體池...