TLSF 内存分配器

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       |
        |                      |
        +--------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_515

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值