rpmalloc作为一个跨平台的无锁带线程缓存的内存管理模块,采用16字节对齐的方式。其拥有较高的性能,与其他一些内存管理模块的性能对比见下图,
Memory分块介绍
Memory blocks通过不同大小分成3类,
- small blocks : [16, 1024] bytes
- medium blocks: (1024, 31232] bytes
- large blocks: (31232, 2097120] bytes
类似于dlmalloc的Smallbins机制,上述三种不同大小的的blocks被细分成不同大小的size_class,
在small block中以16bytes为单元建立一个size_lcass,即这一区间有1024 / 16 = 64 再加上16byte本身为 65个SMALL_CLASS_COUNT。
在medium block中以512 bytes为单元建立一个size_lcass,即这一区间有31232 / 512 = 61 个MEDIUM_CLASS_COUNT。
在large block中以span_size(default = 64KB)为单元建立一个size_class。
如果默认的span_size改变了,small block中的size_class不变,但是medium block的大小改为(1024, span_size]bytes。
当线程缓存溢出并被释放到全局缓存时,或者当线程结束时,跨页可以在线程之间流动。与tcmalloc不同的是,单个块不能在线程之间流动,只有整个跨页(spans of pages)才能流动。
不同 size-classes 的内存配置需求会由不同 memory pages 來提供,且每种 span 只会对应到
一种size class 。