本文主要是介绍[项目][CMP][Thread Cache]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1.设计&结构
- 2.申请内存
- 3.释放内存
- 4.框架
1.设计&结构
-
Thread Cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表
-
每个线程都会有一个Thread Cache对象,这样每个线程在这里获取对象和释放对象时是无锁的
-
TLS – Thread Local Strorage
- Linux gcc下TLS
- Windows vs下TLS
2.申请内存
- 当内存申请size<=256KB,先获取到线程本地存储的Thread Cache对象,计算size映射到哈希桶自由链表下标i
- 如果自由链表_freeLists[i]中有对象,则直接Pop一个内存对象返回
- 如果_freeLists[i]中没有对象时,则批量从Central Cache中获取一定数量的对象,插入到自由链表并返回一个对象
3.释放内存
- 当释放内存小于256k时将内存释放回Thread Cache,计算size映射自由链表桶位置i,将对象Push 到_freeLists[i]
- 当链表的长度过长,则回收一部分内存对象到central cache
4.框架
class ThreadCache
{
public:// 申请和释放内存/对象void *Allocate(size_t size);void Deallocate(void *ptr, size_t size);// 从CentralCache获取内存/对象void *FetchFromCentralCache(size_t index, size_t alignSize);// 释放对象时,链表过长,回收内存回到Central Cachevoid ListTooLong(FreeList &list, size_t size);private:FreeList _freeLists[NFREELIST];
};// 实现无锁访问 -- TLS
// 通过TLS,每个线程无锁地获取自己专属的ThreadCache对象
static _declspec(thread) ThreadCache *pTLSThreadCache = nullptr;
这篇关于[项目][CMP][Thread Cache]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!