記憶體池 簡單的記憶體池的實現

2021-05-31 22:36:16 字數 2024 閱讀 4810

當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多;第二個問題是分配釋放記憶體花費的時間可能比較多(這個問題不太明顯)。這個時候我們就可以考慮使用記憶體池了。

最樸素的記憶體池思想就是,首先你向系統申請一塊很大的記憶體(這塊記憶體因為很大,以致於我們常稱它為memory pool),然後你在上面實現類似於malloc和free等操作。當你需要分配記憶體時,你用自己的類malloc函式從記憶體池上取一小塊給使用者(後文稱之為小記憶體塊),當用類free函式釋放從記憶體池上取得的記憶體時,這個小記憶體塊也並不歸還給系統,而只是還給記憶體池。

最近寫telnet還原程式,寫了個簡易記憶體池,和大家分享下。

這個記憶體池提供這樣的功能:i)提供類malloc函式mem_alloc從記憶體池上獲取固定大小的記憶體,提供類free函式mem_free釋放記憶體到記憶體池中;ii)記憶體池初始大小為某個固定大小(buf_size)的n倍,當記憶體池中的記憶體不夠用時,記憶體池能以一定步長增長直到無系統記憶體。

要實現這些功能,首先應該用乙個資料結構(mem_node_t)將記憶體池中的各個小記憶體塊掛起來;然後為了使記憶體池能夠以一定步長增長,我們要能分配多個大的記憶體塊(即多個小記憶體池),為了能順利的管理各個大的記憶體塊,需要乙個資料結構(mem_block_t)來記錄這些資訊;最後,記憶體池的當前狀態(包括可分配的空閒鍊錶,空閒的小記憶體塊的個數等)是我們感興趣的東西,所以用資料結構(mem_pool_t)來記錄。

typedef union _mem_node

mem_node_t, *pmem_node_t;

typedef struct _mem_block

mem_block_t, *pmem_block_t;

typedef struct _mem_pool

mem_pool_t, *pmem_pool_t;

然後提供了一些操作函式:mem_pool_init用來初始化記憶體池;mem_pool_destroy用來釋放記憶體池,將記憶體池所佔空間歸還系統;print_mem_pool_info用來列印記憶體池的資訊;mem_alloc,用來從記憶體池上分配小記憶體塊;mem_free,將小記憶體塊歸還給記憶體池。

mem_alloc和mem_free操作的就是記憶體池的空閒鍊錶,前者從空閒鍊錶取乙個結點,後者將乙個結點插入空閒鍊錶。而這個空閒鍊錶是由mem_pool_init初始化的,而且當記憶體池增長時,即增加新的大記憶體塊時,我們將大記憶體塊上的小記憶體塊也掛接到這個空閒鍊錶上來。需要注意的是小記憶體塊的資料結構用了聯合,這是因為小記憶體塊要麼是掛接在空閒鍊錶上,要麼是分配給了使用者,必居且只能居這兩種狀態之一,這個資料結構可根據需求適當改進。

在碼**之前,要補充說明的是,不少記憶體池都提供了分配不同大小的記憶體塊的功能,將多個不同大小的本記憶體池鏈結起來也可實現這些功能,改動是比較容易的^_^

最後,本記憶體池在vc6下驗證當頻繁分配釋放100位元組大小的記憶體時,本記憶體池效率約是直接malloc和free的10倍,當分配大」湫∈保時扔興檔停狽峙浯笮≡齟笫保時扔興擼峙1000位元組大小的記憶體時,效率比約為100。

**。#ifndef _mem_pool_h_

#define _mem_pool_h_

#define buf_size 100

#define base_count 10000

#define step_count 1000

typedef union _mem_node

mem_node_t, *pmem_node_t;

typedef struct _mem_block

mem_block_t, *pmem_block_t;

typedef struct _mem_pool

mem_pool_t, *pmem_pool_t;

int mem_pool_init(int base, int step);

void mem_pool_destroy(void);

void print_mem_pool_info(void);

void *mem_alloc(void);

void mem_free(void *ptr);

#endif

簡單的記憶體池實現

記憶體池是用來改善new delete記憶體管理機制可能造成的執行效率低下問題的一種技術 經典的記憶體池技術,是用一種用於分配大量大小相同的小物件技術,加快記憶體分配或者釋放的過程。在看書的過程中,我對簡單的實現乙個記憶體池的實現理解是 1 讓我們在堆上面申請到的記憶體是連續的。2 我們放在記憶體池...

記憶體池簡單實現(一)

記憶體池就是在程式啟動時,預先向堆中申請一部分記憶體,交給乙個管理物件。在程式執行中,需要時向管理物件 借 不需要時 還 給管理物件。原理很簡單,關鍵是怎樣才能高效地 借 還 在c s伺服器中,需要頻繁地收發資料報。而資料報的記憶體採用原始的new delete模式,會大大降低伺服器效能,所以想到了...

記憶體池實現

記憶體池實現 話說一直想找乙個別人寫好的使用,可惜沒什麼人會拿這小東西發布,只好自寫乙個。1.多級鍊錶分配池 我不知道這種設計的具體學名是什麼,這部分的內容也許你去看 stl原始碼分析 的有關章節更合適一些,這裡我只能用我粗陋的語言描述一下。記憶體池,完全可以從字面上理解為從池子裡申請記憶體,釋放的...