此外,开源社区中还有jemalloc和libumem 分配器。
TLSF 虽然拥有 O(1) 时间复杂度的内存管理算法, 适用于实时操作系统, 但是在 32 位系统上仅能保持 4 字节对齐特性, 在 64 位系统上仅能保持 8 字节对齐特性, 不满足 POSIX 对 malloc 具有 2 * sizeof(size_t)对齐的要求, 所有有些软件可能会严重错误, 例如Qt/JavaScript 引擎, 所以使用时需慎重! 只有确认应用没有 2 * sizeof(size_t) 对齐要求时, 方可使用.TLSF 由于具有 O(1) 时间复杂度, 所以他可以使用自旋锁来提高效率, 但会降低系统实时性, 请权衡使用.
以下大部分内容摘录自论文《TLSF: a New Dynamic Memory Allocator for Real-Time Systems》http://www.gii.upv.es/tlsf/files/ecrts04_tlsf.pdf%E3%80%82
TLSF是Two Level Segregated Fit memory allocator的缩写,是一种动态内存分配算法。名称中有两个关键词,Segregated Fit和Two Level。
首先我们来了解什么是Segregated Fit。在内存分配算法中,空闲内存块的管理是算法的核心。根据寻找空闲内存块的策略,可以将内存分配算法分为以下几种:
所以TLSF是一种通过一组链表来管理不同大小内存块的内存分配算法。
基本的Segregated Fit算法是使用一组链表,每个链表只包含特定长度范围来的空闲块的方式来管理空闲块的,这样链表数组的长度可能会很大。如下图,TLSF为了简化查找定位过程,使用了两层链表。第一层,将空闲内存块的大小根据2的幂进行分类,如(16、32、64...)。第二层链表在第一层的基础上,按照一定的间隔,线性分段。比如2的6次方这一段,分为4个小区间【64,80),【80,96),【96,112),【112,128).每一级的链表都有一个bitmap用于标记对应的链表中是否有内存块。比如第一级别bitmap的后4bit位0100,即2的6次方这个区间有空闲块。对应的第二级链表的bitmap位0010及【80,96)这个区间有空闲块,即下面的89 Byte。