内存池管理库 (Pool.c/Pool.h)
👇🏻源码下载
概述
一个轻量级固定大小内存块管理库,适用于嵌入式系统或高频内存分配场景。通过预分配内存和双向链表管理,提供高效的内存分配与释放功能。内存池使用双向链表管理空闲块,并支持相邻空闲块的自动合并,有效减少内存碎片。
内部实现原理
数据结构
内存块结构体 (pool_block_t)
|
|
内存池管理结构体 (mempool_t)
|
|
关键算法
内存分配
- 单块分配 - 直接从空闲链表头部获取一个块,时间复杂度O(1)
- 多块分配 - 查找连续的空闲块,并从空闲链表中移除
内存释放
- 空闲块合并 - 检测并合并左右相邻的空闲块
- 链表维护 - 将释放的块重新加入空闲链表
内存池完整性检查
- 空闲块计数验证 - 确保记录的空闲块数量与实际一致
- 链表环路检测 - 使用快慢指针算法检测链表是否有环
- 节点有效性检查 - 验证每个节点指针是否在有效范围内
功能特性
- ✅ 固定块大小内存管理
- ✅ 双向链表维护空闲块
- ✅ 内存碎片合并优化
- ✅ 内存池完整性检查
- ✅ 清零分配的内存块
- ✅ 支持连续多块分配
- ✅ 自动合并相邻空闲块
快速开始
|
|
API参考
初始化/销毁
| 函数 | 描述 | 参数 | 返回值 |
|---|---|---|---|
MemPool_Init() |
初始化内存池 | block_size: 块大小(字节) block_num: 块数量 |
true: 成功 false: 失败 |
MemPool_Deinit() |
释放内存池资源 | 无 | 无 |
MemPool_Init_Default() |
使用默认参数初始化(64K字节,1024块) | 无 | 同MemPool_Init() |
内存操作
| 函数 | 描述 | 参数 | 返回值 |
|---|---|---|---|
MemPool_Malloc() |
分配内存 | size: 需要分配的字节数 | 非NULL: 内存指针 NULL: 分配失败 |
MemPool_Free() |
释放内存 | ptr: 要释放的内存指针 | true: 成功 false: 失败 |
设计优势
- 高效分配 - O(1)时间复杂度分配单个块
- 碎片合并 - 自动合并相邻空闲块,减少内存碎片
- 安全校验 - 包含内存池完整性检查,防止内存损坏
- 预分配机制 - 避免运行时内存碎片和分配失败
- 双向链表 - 高效的空闲块管理和快速的块移除操作
内部优化
- 快慢指针检测 - 高效检测链表环路,防止内存池损坏
- 内联函数 - 关键分配和释放函数使用内联优化性能
- 位域结构 - 使用位域优化内存块信息存储
- 自动清零 - 分配的内存块自动初始化为零
使用限制⚠️
- 仅支持固定块大小分配
- 非线程安全,多线程环境需额外同步
- 初始化后无法动态扩展内存池大小
- 最大支持32767个连续块(受Blocks_Num字段限制)
典型应用场景
- 嵌入式系统内存管理
- 网络数据包缓冲
- 实时任务调度
- 高频内存分配/释放场景
- 对象池实现
- 消息队列缓冲区
示例配置
|
|
性能提示
🔹 分配单个块比多个连续块更快,单块分配为O(1)复杂度
🔹 释放时会自动合并相邻空闲块,减少内存碎片
🔹 调试时可启用`DEBUG`宏进行内存池完整性检查
🔹 内存分配前会自动清零,无需手动初始化
🔹 内存池放置在SRAM区域,提高访问速度
实现细节
内存布局
内存池由两部分组成:
- 数据区域 - 存储实际数据的连续内存空间
- 管理区域 - 存储每个块的元数据信息
空闲块管理
- 使用双向链表连接所有空闲块
- 新分配的块从链表头部获取
- 释放的块添加到链表头部
连续块分配
当需要分配多个连续块时:
- 扫描内存池查找连续空闲块
- 从空闲链表中移除这些块
- 更新第一个块的Blocks_Num字段
内存释放与合并
释放内存时会检查左右相邻块:
- 如果有相邻空闲块,从空闲链表中移除
- 合并所有相邻空闲块为一个大块
- 将合并后的大块添加到空闲链表头部