TLSF内存管理算法原理详解

 TLSF算法原理概述

        TLSF算法的核心优势在于其通过位运算执行内存块匹配算法,并兼顾了内存管理的额外内存消耗,无论是从内存池申请内存块还是释放内存块回内存池其操作都是O(1)。TLSF组织了一张一二级索引表映射其所有管理内存块的闲忙状态,并通过一个二维指针数组挂载所有空闲块双向链表的首节点。

        一二级索引表中,一级索引通过一个无符号整形变量,变量所占字节由平台决定32位或64位,变量中每个bit映射一级内存块,内存块通过大小划分等级,等级组织上以2的指数幂划分,例如2^7 、2^8 、2^9 ...分别对应一级索引值7、8、9 ...,将内存块划分到128/256/512...内;这有一点需要注意的是一级索引值(FL)与一级索引等级(FLi),一级索引值指的是内存块对应的一级索引范围起始值的2的指数幂,例如一级索引值8对应的起始值28 =256,而一级索引等级对应的是一级索引无符号整形变量的bit index,通常会有一个一级索引偏移值,一级索引值减去一级索引偏移值得到一级索引等级,这个一级索引偏移值对应的就是一级索引表的起始等级,例如偏移值为7,表明一级索引值2^7 对应的就是第1级一级索引(等级从1开始),计算出的一级索引值减去偏移值7,即为一级索引等级,小于2^7 = 128字节的内存块都将挂载到一级范围内管理;设置一级偏移值目的是为了方便后面计算二级索引表以及挂载空闲块链表首节点的二维数组的下标,避免空间浪费。

        一二级索引表中,二级索引表是一个无符号整形一维数组,进一步将内存块等级范围进行细分,其一维下标就是一级索引值,对应的就是该一级索引下各内存块进一步划分,划分方式为等分,划分依据是通过一个颗粒度变量决定通常取一个经验值,32位平台下通常为2^5 /2^4 即划分为32份,例如一级索引值为8时,一级索引范围为2^8 ~2^9 = 256 ~ 512之间,划分32份每份为256/32=8字节,二级进一步细分为32个8字节,各内存块根据大小放入对应的细分等级下管理。

        二级链表头指针数组,挂载所有空闲块双向链表首节点的二维数组,是空闲内存块的管理实体,无论是申请还是释放,根据目标内存块的大小,计算出对应的一二级索引,对应的就是二维数组的下标,例如一二级索引fl,sl = [1, 2],对应的block[1][2]中存的就是272~280范围内的空闲块链表首节点。

        申请内存块 tlsf_malloc(size),大致流程为:根据size计算目标空闲块所处一二级索引值,并转换成下标二级链表头指针数组的下标,取出目标内存块所在链表头节点,如果目标链表中还有空闲块,则直接取出首节点的空闲块即将该节点移出所处的空闲链表,如果目标链表中没有空闲块则向上一级继续寻找,二级索引链表没有就将一级索引也向上一级,如果都没有则分配失败;成功取出空闲块之后,需要判断空闲块是否大于size,如果大于足够的空间则需要对该空闲块进行切割,并将切割出的剩余空闲块重新插入空闲链表中。

释放内存块 tlsf_free(void * p),大致流程为:根据指针p向前偏移一个块头,得到内存块的块头即得到内存块的信息,将内存块数据域清除,并将其与其物理上的前一个空闲块合并(如果有这个空闲块),再将其与其物理上的后一个空闲块合并(如果有这个空闲块),将合并后的空闲块重新插入空闲链表。

TLSF(Two-Level Segregated Fit)内存分配算法是一种通用的动态内存分配算法,专门设计用于满足实时要求。它具有以下特点: 1. 算法复杂度为O(1):TLSF算法通过使用两级位图和分级空闲块链表的数据结构来管理动态内存池和其中的空闲块。这种设计使得malloc、free、realloc和memalign等操作的时间复杂度都为O(1),即常数时间。 2. 低碎片化:TLSF算法采用Good-Fit的策略进行内存分配,即选择最合适大小的空闲块进行分配。这样可以减少内存碎片化,提高内存利用率。 3. 支持动态添加和删除内存池区域:TLSF算法支持在运行时动态地增加或删除多块不连续的内存,将它们作为一个内存堆使用。这种灵活性使得TLSF算法适用于各种内存管理场景。 下面是一个使用TLSF内存分配算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include "tlsf.h" int main() { // 创建一个TLSF内存池 void* pool = malloc(1024 * 1024); // 分配1MB的内存作为内存池 tlsf_pool tlsf = tlsf_create_with_pool(pool, 1024 * 1024); // 分配内存 void* ptr1 = tlsf_malloc(tlsf, 100); // 分配100字节的内存 void* ptr2 = tlsf_malloc(tlsf, 200); // 分配200字节的内存 // 使用分配的内存 sprintf(ptr1, "Hello"); sprintf(ptr2, "World"); // 打印分配的内存 printf("ptr1: %s\n", (char*)ptr1); printf("ptr2: %s\n", (char*)ptr2); // 释放内存 tlsf_free(tlsf, ptr1); tlsf_free(tlsf, ptr2); // 销毁TLSF内存池 tlsf_destroy(tlsf); // 释放内存池 free(pool); return 0; } ``` 这段代码演示了如何使用TLSF内存分配算法进行内存分配和释放。首先,我们创建一个TLSF内存池,并使用tlsf_malloc函数分配内存。然后,我们使用分配的内存进行操作,并最后使用tlsf_free函数释放内存。最后,我们销毁TLSF内存池并释放内存池。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值