記憶體池 mempool

2021-09-10 22:03:25 字數 1236 閱讀 7564

在核心中有不少地方記憶體分配不允許失敗。 作為乙個在這些情況下確保分配的方式, 核心開發者建立了一種稱為記憶體池(或者是 "mempool" )的抽象.。記憶體池其實就是某種形式的後備快取記憶體, 它試圖始終儲存空閒的記憶體,以便在緊急時使用.。

記憶體池物件型別mempool_t定義在中。

typedef struct mempool_s  mempool_t;
建立記憶體池物件:

mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,

mempool_free_t *free_fn, void *pool_data);

min_nr:為記憶體池應始終要保持已分配物件的最少數目。

alloc_fn:物件分配函式

free_fn:物件釋放函式

poll_data:被傳入alloc_fn和free_fn

typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data);

typedef void (mempool_free_t)(void *element, void *pool_data);

調整記憶體池大小:

int mempool_resize(mempool_t *pool, int new_min_nr);
如果函式呼叫成功,將被記憶體池的大小調整為至少有new_min_nr個預分配物件。

銷毀記憶體池:

當不再需要使用記憶體池時可以用以下函式銷毀記憶體池。

void mempool_destroy(mempool_t *pool);
在建立mempool時,就會多次呼叫分配函式為預先分配的物件建立記憶體池。之後對mempool_alloc的呼叫將首先通過分配函式獲得該物件;如果該分配失敗,就會返回預先分配的物件(如果存在的話)。如果使用mempool_free釋放乙個物件,則如果預先分配的物件數目小於要求的最低數目,就會將該物件保留在記憶體池中;否則,該物件會返回給系統。

在銷毀mempool之前,必須將所有已經分配的物件返回到記憶體池中,否則會導致oops。

使用mempool很容易引起浪費大量記憶體。幾乎在所有情況下,最好不使用mempool而是處理可能的分配失敗。

記憶體池 MemPool 技術詳解

記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分配大量...

記憶體池 MemPool 技術詳解

記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分配大量...

記憶體池 MemPool 技術詳解

概述 記憶體池 mempool 技術備受推崇。我用google搜尋了下,沒有找到比較詳細的原理性的文章,故此補充乙個。另外,補充了boost pool元件與經典mempool的差異。同時也描述了mempool在sgi stl stlport中的運用。經典的記憶體池 mempool 技術,是一種用於分...