TLSF (Two-Level Segregated Fit) 是一个O(1)时间复杂度的动态内存分配器,特别适合实时系统。本文将深入分析TLSF的实现原理和源码细节。
1. 基本概念
1.1 关键特性
-
O(1)时间复杂度的内存分配和释放
-
低内存碎片化
-
确定性行为,适合实时系统
-
支持多内存池管理
-
最小内存对齐支持
1.2 核心数据结构
块头(Block Header)
typedef struct block_header_t {
struct block_header_t* prev_phys_block; // 指向物理相邻的前一个块
size_t size; // 块大小,包含控制位
struct block_header_t* next_free; // 空闲块链表的下一个节点
struct block_header_t* prev_free; // 空闲块链表的前一个节点
} block_header_t;
块头中size字段的低两位用作标记位:
-
bit 0: 当前块是否空闲
-
bit 1: 前一个块是否空闲
TLSF控制结构
typedef struct control_t {
block_header_t block_null; // 空闲链表的哨兵节点
unsigned int fl_bitmap; // 第一级位图
unsigned int sl_bitmap[FL_INDEX_COUNT]; // 第二级位图
block_header_t* blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; // 空闲块数组
} control_t;
2. 内存布局
2.1 初始化后的内存布局举例
当调用 mm_initialize 初始化 TLSF 时,传入参数 heapstart=0x10000, heapsize=0x10000:
0x10000 +------------------------+
| struct mm_heap_s | <-- heap控制结构(116字节)
| (sizeof = 116 bytes) |
0x10074 +------------------------+
| tlsf control block | <-- tlsf内部控制块
| (tlsf_size() bytes) | (包含空闲块链表、位图等)
0x10474 +------------------------+
| first block header | <-- 第一个block的header
| (8 bytes) | 包含:
0x1047C +------------------------+ - 块大小(含header)
| first block | <-- - 使用/空闲标志位
| user data area | 低2位用作标记位:
| | bit 0: 当前块是否空闲
+------------------------+ bit 1: 前一个块是否空闲
| next block header |
| (8 bytes) |
+------------------------+
| next block |
| user data area |
| |
+--------------------