内存池-mempool

本文深入探讨了内核中的内存池(mempool)机制,一种确保在关键情况下内存分配不会失败的重要手段。内存池对象类型mempool_t的定义、创建、调整和销毁过程被详细阐述,同时指出了在内存管理中使用mempool的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内核中有不少地方内存分配不允许失败。 作为一个在这些情况下确保分配的方式, 内核开发者创建了一种称为内存池(或者是 "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而是处理可能的分配失败。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值