什么是TCMalloc?它与标准内存分配器有何不同?
传统的内存分配器:
- 使用全局堆管理,如glibc,malloc
- 所有内存分配和释放都需要用到全局锁,导致高并发下锁竞争严重
- 内存碎片管理: 碎片化问题严重
- 每次操作都需要经过经过全局堆
结构
对于memory cache和CentralCach,内部都是维护了不同类型的FreeList
TCMalloc是如何管理内存的?其算法的时间和空间复杂度是多少?
- 线程本地缓存
- Central free list
用于管理大块内存以及当线程本地缓存不足时提供内存 - page allocator
管理实际内存页,page allocator从操作系统请求大块内存,然后将其分配给central cache和本地线性缓存 - 批量分配
本地线程需要内存时,它会从central free list一次性获取多块内存,而不是每次只获取一块--->减少锁竞争,提高内存利用率 - 回收机制
当本地线程缓存的某种大小内存块数量超过一定阈值时,多余的内存块会被返回到central free list
- 分配和释放小块内存时间复杂度O(1),空间复杂度:O(T*S),S是每个线程本地缓存的最大空间
- 分配和释放大块内存涉及到Page allocator,时间复杂度是O(1),空间复杂度是O(N),其中N是程序所需的总内存
thread cashing
每个线程都维护一个本地的内存缓存,称为线程本地缓存(Thread Local Cache)。用于存储小块内存,以便线程能快速分配和释放,其效果是减少各线程对全局内存池访问的频率,从而降低了线程间的锁竞争激烈程度。
标签:缓存,复杂度,线程,内存,本地,分配,TCmalloc From: https://www.cnblogs.com/songyaxuan/p/18213197