内存池 (Memory Pool)是一种内存分配方式,是为了减少频繁使用 malloc/free new/delete 等系统调用而造成的性能损耗而设计的,具有效率高、内存碎片少和防止内存泄漏等特性。内存池根据实际需要,在初始状态获取一大块内存(堆区或者静态内存),然后划分成若干内存页,进行管理,将内存页中的块传递给申请者使用。SDK中采用TLSF内存分配器管理,专门设计用于满足实时要求。
TLSF (Two-Level Segregated Fit memory allocator), 是一款通用的动态内存分配器,具有以下特点,
TLSF主要采用两级位图(Two-Level Bitmap)与分级空闲块链表(Segregated Free List)的数据结构管理动态内存池(memory pool)以及其中的空闲块(free blocks),用Good-Fit的策略进行分配。
TLSF算法分配速度不一定快,只是说能保证分配的时间是个常数(malloc不能保证)。
TLSF也叫多内存堆管理算法,支持动态增加或者删除多块不连续的内存,将它们作为一个内存堆使用。
FMemory Pool主要完成内存池的初始化,为用户提供多种内存申请方法,支持内存池的使用情况监测,
相关源文件为:
fmempory_pool
├── fmempory_pool.c
└── fmempory_pool.h
tlsf
├── tlsf.c
└── tlsf.h
以下部分将指导您完成 FMemory Pool 的软件配置:
common/fmempory_pool.h
typedef struct
{
pool_t pool_addr;
FSListNode list;
} FMempPoolList; /* 内存池控制数据 */
typedef struct
{
FMempPoolList *pools_list; /* 内存池链表 */
tlsf_t tlsf_ptr; /* tlsf内存池 */
u32 is_ready; /* 内存池初始化完成标志 */
} FMemp; /* 内存池控制数据 */
模块错误码编号 0x0010000
[0x0] FMEMP_SUCCESS : success
[0x0010000] FMEMP_ERR_INVALID_BUF : 输入的内存池缓存区不合法
[0x0010001] FMEMP_ERR_INIT_TLFS : 初始化TLFS内存池失败
[0x0010002] FMEMP_ERR_BAD_MALLOC : 从TLFS内存池分配空间失败
初始化内存池, 分配内存池的内存空间
FError FMempInit(FMemp *memp, void *begin_addr, void *end_addr);
Note:
Input:
Return:
释放所有分配的内存,删除内存池
void FMempRemove(FMemp *memp);
Note:
Input:
Return:
从内存池申请一段空间
void *FMempMalloc(FMemp *memp, fsize_t nbytes);
Note:
Input:
Return:
从内存池申请一段数组空间并清零
void *FMempCalloc(FMemp *memp, fsize_t count, fsize_t size)
Note:
Input:
Return:
按指定对齐方式申请一段空间
void *FMempMallocAlign(FMemp *memp, fsize_t size, fsize_t align);
Note:
Input:
Return:
回收原来申请的空间并重新分配
void *FMempRealloc(FMemp *memp, void *ptr, fsize_t nbytes);
Note:
Input:
Return:
释放一段从内存池申请的空间
void FMempFree(FMemp *memp, void *ptr);
Note:
Input:
Return:
跟踪当前内存池的使用情况
void FMemProbe(FMemp *memp, u32 *total, u32 *used, u32 *max_used);
Note:
Input:
Return:
打印当前分配的内存块信息
void FMemListAll(FMemp *memp);
Note:
Input:
Return: