uC/os内存优化——TLSF算法

需求

uC/os内存管理机制为内存块形式,用户申请内存是需要自己指定内存区内内存块数和内存块大小,看起来很灵活,实际上很不方便,需要使用者记住内存块大小,自己维护内存区,给使用者增加了负担。

TLSF算法能够满足实时性的要求,并且可有效的较小内部碎片。TLSF作为分离式空闲链表算法(Segregated Free Lists)的拓展--将相似的空闲块利用数组或者二叉树进行管理从而使响应时间与空闲块数量相互独立,能够满足实时系统的需求。LINUX使用的兄弟算法,能将碎片控制在内存块大小的1/2之下,而TLSF算法将内存块大小进行更细致的分类,将内部碎片尽量缩小。TLSF在内存释放时则会立即释放并且与相邻的空闲内存进行合并。其他的DSA或许会进行延迟合并,或者根本不合并。这种机制在应用反复申请相同大小的内存时会很有用,但是延迟合并带来的是时间的不可预测,所以TLSF避免了这种现象。

算法思想

TLSF的全称是Two Level Segregated Fit memory allocator,名称就显示了此算法的特点,segregated fit 和 two level。基本的Segregated Fit算法是使用一组链表来管理空闲块,每个链表只包含特定长度范围内的空闲块,而管理这些链表头的数组会非常冗长,TLSF使用了二位数组来管理这些表头,简化了查找定位的过程。在第一层将空闲块大小按照2的次幂进行粗分,因为内存块大小至少为2^4,所以一般分为(16、32、、、、2^31),第二层在第一层的基础上,按照规定好的间隔对内存块进行细分,比如我们可以将2^4~2^5大小的内存块进一步分为(16~20),(20~24),(24~28),(28~32)。分成几个区间可以由用户设定(但一定是2的次方个)。每一级都对应bitmap中的一个位来表示是否有空闲块。

内存状态立体化结构如图

比如上图中第一级的bitmap中第三位为1,那么就有大小为2^6~2^7的空闲块,再查看二级Bitmap,第二位为1说明有大小为2^6+16~2^6+32的空闲块。

那么给定一个内存大小怎么知道他所对应的一二级索引值呢

我们可以观察到,f的值为size的最高有效位的位数。S为偏移量除以区间大小。

算法实现

数据

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值