乙個簡單記憶體池實現

2021-05-02 05:47:41 字數 1485 閱讀 7328

最近面試被問了乙個記憶體池的實現,關鍵是記憶體塊的組織,說來慚愧,由於之前沒有詳細去了解過實現,只記得作業系統上有說過空閒鍊錶的實現,即按分配的塊用鍊錶鏈結,有小塊優先,大塊優先等~~~~

後來回來認真地找了幾個記憶體池實現的技術介紹,多數是以乙個固定塊,每個塊又有固定長度的單元組成。參考了網上的一些實現方法,實現了這個簡單的記憶體池,測試了一下,效果還可以呵呵~~~

(注意如果要加大測試量,要加入棧空間以防棧溢位)

雖然是實現了,但還是對記憶體池的一些疑問~~小於塊長度的記憶體分配請求會浪費空間(因為第次alloc會分配乙個固定長度記憶體單元,方便**),大於塊長度的請求,又要用多塊拼接而成。然而拼接的方法是個很大問題,如果設計為連續記憶體塊,會有很嚴重的空洞問題;如果設計成煉表結構,所有和這段資訊相關的處理函式就都需要支援這種鍊錶,否則就會引入額外的記憶體拷貝。

記憶體池補充資料:

1. 可以有固定分割槽分配(分配方法如字面意思,不再累述)

可變分割槽分配:為程序分配的空間是可變的(依照需要變化),其中又有幾種不同的具體分配方法如:

最佳適應演算法:程序退出後返還占用的記憶體,但是會產生不連續的記憶體,就像磁碟碎片一樣。最佳適應演算法就是從剩下的記憶體中找到一塊大小最合適(不一定和需要的一樣大,但必須》=需要的大小)的分配給程序,當然只分配程序需要的大小而那一塊中剩下的部分(如果還有剩下)依然空閒。

首次適應演算法:從頭開始進行匹配,當第一次找到》=需要大小的記憶體塊就進行分配。

迴圈首次適應演算法:和首次適應差不多,只不過他不從頭開始匹配,他是從當前的下一塊記憶體開始匹配。

每種分配方法都有自己的優點和缺點,應當視具體情況選擇。

3.論壇上的一些回答

(1)大塊記憶體要怎麼分配好呢?還是直接用系統分配實現?

個人認為大塊記憶體直接用系統分配實現更好,用記憶體池的話多了很多 步驟

(2)大家能否介紹一下工作中用到記憶體池地方,以及帶來的效能效應怎麼樣呢?

個人覺得記憶體池多用在那些記憶體塊比較小,而且經常分配釋放頻率比較高的時候。因為如果是大塊記憶體的使用用記憶體池效率不好!!還有就是如果是小塊的記憶體如果經常需要分配和釋放的話,用記憶體池效率比較快

4.測試資料

debug:

system new( 10000000 ) time:2281

system delete( 10000000 ) time:4141

mempool alloc( 10000000 ) time:812

mempool free( 10000000 ) time:594

release:

system new( 10000000 ) time:1032

system delete( 10000000 ) time:1218

mempool alloc( 10000000 ) time:407

mempool free( 10000000 ) time:250

C 實現乙個簡單記憶體池

在使用記憶體池進行記憶體管理之前,通常使用new malloc或者delete free來申請或者釋放記憶體。在這個過程中,系統要首先查詢內部維護的記憶體空閒塊表,並且需要根據比如lru等記憶體分配演算法找到合適大小的空閒記憶體塊。如果該空閒記憶體塊過大,還需要切割成已分配的部分和較小的空閒塊。然後...

乙個簡單的記憶體池

為什仫要使用記憶體池?1.通常我們用new delete和malloc free來管理記憶體,可能會需要頻繁的呼叫記憶體,減少執行時間,增加效率.2.避免記憶體碎片 傳統的new delete的弊端 1.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法.然後...

乙個簡單的記憶體池

記憶體池是我們經常使用的一種池,常見的池還有程序池 執行緒池和連線池,今天我們就先討論記憶體池。首先看一下池的定義 池 池就是在初始時,申請比剛開始要使用的資源大的多的資源空間,接下來使用時,直接從池中獲取資源。記憶體池 即在初始時申請分配一定數量的。大小相等的記憶體塊留作備用,此後如有需要直接從該...