下面的参考数据仅是指64位程序的, 32位的配置和64位不同.
M_TSDS_COUNT_MAX
设置线程局部存储(TSL)相关的TSD的数目, M_TSDS_COUNT_MAX设置为8后, 如小于等于8个线程, 每个线程会绑定一个TSD.
在每个线程中 使用malloc free时, 会根据线程状态寄存器查找到其绑定的TSD缓存池.
scudo没有外部配置的情况下, 只有两个TSD缓存池, 在配置
M_TSDS_COUNT_MAX
后, 会产生最多M_TSDS_COUNT_MAX
个缓存池, 该值会影响 small(primary) 分配器. 在TSD缓存池少的情况下, 会出现多个线程共用一个TSD缓存池的情况, 分配释放内存时需要等锁.Secondary 分配器没有绑定TSD(不是线程私有), 是所有线程共用同一块缓存池, 分配释放需要加锁等锁.
jemalloc5 中 在sz index(36-45范围内的), 当前的配置字节在(14336- 65536)) 使用的缓存是绑定tcache的(线程私有).
M_CACHE_COUNT_MAX
option->MaxCacheEntriesCount
large(Secondary) 分配器在分配释放内存时, 所有线程共用的
缓存池的容量
, 每次free 时, 会先将该内存单元放到缓存池中, 下次malloc时, 会优先根据分配的size 在缓存池中查找是否有匹配的缓存内存单元, 如果有则直接把该内存单元的地址返回给调用方.large(Secondary)的缓存池在满了以后, 下一次free时, 会重置清空缓存池
该值对应上图的
EntriesArraySize
, 默认值为32, 最大只能设置到256, 如果超过256, 会设置失败, 用默认值.M_CACHE_SIZE_MAX
option->MaxCacheEntrySize
在free时, large(Secondary) 分配器并不是将所有大于small分配器的内存单元全部放到缓存池中, 而是在
0x40010
-M_CACHE_SIZE_MAX
范围内的会在free时放到缓存池中(small的范围0-0x40010
), malloc时会优先从缓存池中查找. 而大于M_CACHE_SIZE_MAX
的malloc则直接走mmap, free走unmap
.该值对应上图的
MaxEntrySize
, 默认值是2M