TLSF算法的简单使用及相关机制讲解

简介

TLSF算法是专门用作内存管理的算法,作为内存管理的算法它就逃不开初始化申请释放操作,那么这里就简单介绍一下这几个操作,让大家更好的上手使用这个开源算法。
如果大家不了解这个算法的话可以先阅读这篇文章:
TLSF – 内存管理中的超级英雄!
文章会按照以下顺序介绍,大家按需阅读:

  1. 源文件获取
  2. 堆区初始化
  3. 内存申请
  4. 内存释放

源文件获取

源代码可以直接从github上获取:
https://github.com/mattconte/tlsf
获取成功后,我们可以直接将tlsf.h和tlsf.c文件导入到我们的工程中就可以直接使用了。

堆区初始化

首先介绍一下堆区初始化设计的函数

tlsf_t tlsf_create(void* mem);
tlsf_t tlsf_create_with_pool(void* mem, size_t bytes);
pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes);

函数作用:

1.tlsf_t tlsf_create(void* mem);

根据传入的内存空间初始化堆管理器,返回初始化完成后的指针,指针指向管理器的头部,即mem指针指向的地址。
如下图:

screenshot_image.png

2.pool_t tlsf_add_pool(tlsf_t tlsf, void* mem, size_t bytes);

函数用于将指定大小的内存块加入到堆管理器中。

3.tlsf_t tlsf_create_with_pool(void* mem, size_t bytes);

这个函数是上述两个函数的结合体,它的执行步骤如下:

  • 调用tlsf_create创建堆管理器
  • 将初始化之后剩余的内存加入到堆管理器中,即将上图中control_t后面的空间加入到堆管理器中。

基于上述的三个函数,我们可以有两种方式初始化堆区
方式一:
将一片内存(空间大小大于control_t结构体的内存)传入tlsf_create_with_pool函数进行初始化

这种方式适用于内存块大小比较大的情况

例:创建一个大小为8kb的字符数组,然后传入函数进行初始化

char heap[8192];

tlsf_create_with_pool(heap, sizeof(heap));

方式二:
先创建堆管理结构体,然后再将另一块内存加入内存池
例:两块内存,一块用于堆管理器初始化,另一块用于加入内存池

这种方式适用于有多块内存的情况

char heap_control[4096];
char heap[4096];

tlsf_t tlsf = tlsf_create(heap_control);
tlsf_add_pool(tlsf, heap, sizeof(heap))

注:tlsf_t 类型 实质为 void * 类型

内存申请

内存涉及的函数

void* tlsf_malloc(tlsf_t tlsf, size_t bytes);
void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size);

函数作用:

1.void* tlsf_malloc(tlsf_t tlsf, size_t bytes);

传入堆管理器的指针以及想要获取的内存大小,我们就可以获取到我们想要的内存空间,它的执行过程如下:
将bytes的大小转换成该大小在位图中的位置,如果该位置上有空闲空间能够分配,那么就将该空间分配出去,如果没有则寻找比它大的空间,并且这个空间是所有比bytes大的空间中最小的那个,找到了则对其进行分割并将目标大小的内存块分配出去,否则直接返回空。
具体的流程图如下:

screenshot_image.png

2.void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size);

该函数最主要的作用就是重新分配一份指定大小内存空间,这里不作详细讲解。

内存释放

内存释放就涉及一个函数

void tlsf_free(tlsf_t tlsf, void* ptr);

它释放内存的步骤很好理解:

  1. 如果释放内存的前一个内存块处于空闲状态,那么就将释放的内存与前一个内存块合并
  2. 判断后一个内存的状态,如果空闲则与合并后的内存块再次合并
  3. 将合并完成的内存块插入回内存池中

总结

基于这几个函数大家基本上是能够比较好的去使用tlsf算法管理内存了,如果大家在阅读文章时有什么疑问可以在评论区提问,我也会积极回复的。大家对tlsf算法感兴趣的话也可以阅读源码,它的源码真的超级工整好看,非常建议大家去阅读。

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

余额充值