1. CentralCache模块概述
在上一篇文章中,我们实现了ThreadCache模块,它作为高并发内存池的第一层缓存,为每个线程提供无锁的内存分配能力。今天我们要深入探讨的是CentralCache模块,它是连接ThreadCache和PageCache的关键桥梁。
CentralCache的核心设计理念是:
- 作为所有线程共享的中心缓存
- 采用哈希桶结构,与ThreadCache保持相同的映射关系
- 每个桶内管理的是SpanList链表结构
- 通过桶锁(而非全局锁)实现线程安全
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CentralCache核心架构解析
2.1 哈希桶映射设计
CentralCache采用与ThreadCache完全一致的哈希桶映射策略,这样设计的好处是:
- 内存申请时,ThreadCache可以直接根据大小计算出对应的桶索引
- 释放内存时,也能快速定位到对应的CentralCache桶位置
- 保持了两层缓存之间的高效对应关系
映射规则如下(与ThreadCache完全一致):
cpp复制// 对齐规则
[1,128] -> 8字节对齐
[128+1,1024] -> 16字节对齐
[1024+1,8*1024] -> 128字节对齐
[8*1024+1,64*1024] -> 1024字节对齐
[64*1024+1,256*1024] -> 8*1024字节对齐
// 桶数量分配
[1,128] -> 16个桶
[128+1,1024] -> 56个桶
[1024+1,8*1024] -> 56个桶
[8*1024+1,64*1024] -> 56个桶
[64*1024+1,256*1024] -> 24个桶
总计208个桶
2.2 Span与SpanList结构
Span结构体
Span是CentralCache管理内存的基本单元,其核心字段包括:
cpp复制struct span {
PAGE_ID _pageId; // 起始页号
size_t _n; // 页数量
span* _next; // 双向链表指针
span* _prev;
size_t _useCount; // 已分配对象计数
