内存池管理
静态内存池接口
结构体 | |
struct | rt_mempool |
内存池控制块 更多... | |
类型定义 | |
typedef struct rt_mempool * | rt_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_mempool * | mp, |
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_mempool * | mp | ) |
脱离内存池
该函数将把内存池对象从内核对象管理器中删除。使用该函数接口后, 内核先唤醒所有等待在该内存池对象上的线程,然后将内存池对象从 内核对象管理器中删除。
- 参数
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.