内存池管理

优质
小牛编辑
140浏览
2023-12-01

静态内存池接口

结构体

struct  rt_mempool
 内存池控制块 更多...
 

类型定义

typedef struct rt_mempoolrt_mp_t
 内存池类型指针定义
 

函数

rt_err_t rt_mp_init (struct rt_mempool *mp, const char *name, void *start, rt_size_t size, rt_size_t block_size)
 初始化内存池
 
rt_err_t rt_mp_detach (struct rt_mempool *mp)
 脱离内存池
 
rt_mp_t rt_mp_create (const char *name, rt_size_t block_count, rt_size_t block_size)
 创建内存池
 
rt_err_t rt_mp_delete (rt_mp_t mp)
 删除内存池
 
void * rt_mp_alloc (rt_mp_t mp, rt_int32_t time)
 分配内存块
 
void rt_mp_free (void *block)
 释放内存块
 

详细描述

静态内存池接口

内存池(Memory Pool)是一种内存分配方式,用于分配大量大小相同的小内存块。 它可以极大地加快内存分配与释放的速度,且能尽量避免内存碎片化。当内存池为空时, 可以阻止分配的线程(或者立即返回,或者等待一段时间返回,这由timeout参数确定)。 当其他线程向此内存池释放内存块时,被阻塞的线程将被唤醒。

函数说明

rt_err_t rt_mp_init(struct rt_mempoolmp,
const char * name,
void * start,
rt_size_t size,
rt_size_t block_size 
)

初始化内存池

该函数将初始化一个内存池对象,通常用于静态对象。

参数
mp内存池对象句柄
name内存池的名称
start内存池的起始地址
size内存池数据区域大小
block_size内存块容量
返回
RT_EOK 初始化成功;- RT_ERROR 失败
示例:
memp_sample.c.
rt_err_t rt_mp_detach(struct rt_mempoolmp)

脱离内存池

该函数将把内存池对象从内核对象管理器中删除。使用该函数接口后, 内核先唤醒所有等待在该内存池对象上的线程,然后将内存池对象从 内核对象管理器中删除。

参数
mp内存池对象
返回
RT_EOK
rt_mp_t rt_mp_create(const char * name,
rt_size_t block_count,
rt_size_t block_size 
)

创建内存池

调用该函数将会创建一个内存池对象并从堆上分配一个内存池。创建内存池是从对应内存池中分配 和释放内存块的先决条件,创建内存池后,线程便可以从内存池中执行申请、释放等操作。

参数
name内存池的名称
block_count内存块数量
block_size内存块容量
返回
创建的内存池的句柄;RT_NULL 创建失败
rt_err_t rt_mp_delete(rt_mp_t mp)

删除内存池

该函数将删除内存池对象并释放申请的内存。删除内存池时,会首先唤醒等待在该内存池对象上的 所有线程(返回 - RT_ERROR),然后再释放已从内存堆上分配的内存池数据存放区域,然后删除 内存池对象。

参数
mp内存池对象句柄
返回
RT_EOK
void* rt_mp_alloc(rt_mp_t mp,
rt_int32_t time 
)

分配内存块

该函数将从指定的内存池中分配一个内存块,如果内存池中有可用的内存块,则从内存池的 空闲块链表上取下一个内存块,减少空闲块数目并返回这个内存块;如果内存池中已经没有 空闲内存块,则判断超时时间设置:若超时时间设置为零,则立刻返回空内存块;若等待 时间大于零,则把当前线程挂起在该内存池对象上,直到内存池中有可用的自由内存块, 或等待时间到达。

参数
mp内存池对象
time超时时间
返回
成功则返回分配的内存块,失败则返回 RT_NULL
示例:
memp_sample.c.
void rt_mp_free(void * block)

释放内存块

任何内存块使用完后都必须被释放,否则会造成内存泄露。调用该函数释放指定的内存块, 首先通过需要被释放的内存块指针计算出该内存块所在的(或所属于的)内存池对象, 然后增加内存池对象的可用内存块数目,并把该被释放的内存块加入空闲内存块链表上。 接着判断该内存池对象上是否有挂起的线程,如果有,则唤醒挂起线程链表上的首线程。

参数
block将要被释放的内存块指针
示例:
memp_sample.c.