TLSF算法是专门用作内存管理的算法,作为内存管理的算法它就逃不开初始化申请释放操作,那么这里就简单介绍一下这几个操作,让大家更好的上手使用这个开源算法。
如果大家不了解这个算法的话可以先阅读这篇文章:
TLSF – 内存管理中的超级英雄!
文章会按照以下顺序介绍,大家按需阅读:
- 源文件获取
- 堆区初始化
- 内存申请
- 内存释放
源代码可以直接从github上获取:
https://github.com/mattconte/tlsf
获取成功后,我们可以直接将tlsf.h和tlsf.c文件导入到我们的工程中就可以直接使用了。
首先介绍一下堆区初始化设计的函数
函数作用:
1.tlsf_t tlsf_create(void* mem);
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的字符数组,然后传入函数进行初始化
方式二:
先创建堆管理结构体,然后再将另一块内存加入内存池
例:两块内存,一块用于堆管理器初始化,另一块用于加入内存池
这种方式适用于有多块内存的情况
注:tlsf_t 类型 实质为 void * 类型
内存涉及的函数
函数作用:
1.void* tlsf_malloc(tlsf_t tlsf, size_t bytes);
传入堆管理器的指针以及想要获取的内存大小,我们就可以获取到我们想要的内存空间,它的执行过程如下:
将bytes的大小转换成该大小在位图中的位置,如果该位置上有空闲空间能够分配,那么就将该空间分配出去,如果没有则寻找比它大的空间,并且这个空间是所有比bytes大的空间中最小的那个,找到了则对其进行分割并将目标大小的内存块分配出去,否则直接返回空。
具体的流程图如下:
2.void* tlsf_realloc(tlsf_t tlsf, void* ptr, size_t size);
该函数最主要的作用就是重新分配一份指定大小内存空间,这里不作详细讲解。
内存释放就涉及一个函数
它释放内存的步骤很好理解:
- 如果释放内存的前一个内存块处于空闲状态,那么就将释放的内存与前一个内存块合并
- 判断后一个内存的状态,如果空闲则与合并后的内存块再次合并
- 将合并完成的内存块插入回内存池中
基于这几个函数大家基本上是能够比较好的去使用tlsf算法管理内存了,如果大家在阅读文章时有什么疑问可以在评论区提问,我也会积极回复的。大家对tlsf算法感兴趣的话也可以阅读源码,它的源码真的超级工整好看,非常建议大家去阅读。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/7161.html