在内核中有不少地方内存分配不允许失败。 作为一个在这些情况下确保分配的方式, 内核开发者创建了一种称为内存池(或者是 "mempool" )的抽象.。内存池其实就是某种形式的后备高速缓存, 它试图始终保存空闲的内存,以便在紧急时使用.。
内存池对象类型mempool_t定义在<linux/mempool.h>中。
typedef struct mempool_s {
spinlock_t lock;
int min_nr; /* nr of elements at *elements */
int curr_nr; /* Current nr of elements at *elements */
void **elements;
void *pool_data;
mempool_alloc_t *alloc;
mempool_free_t *free;
wait_queue_head_t wait;
} 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而是处理可能的分配失败。