1. CentralCache 核心设计解析
在实现高并发内存池时,CentralCache 作为连接 ThreadCache 和 PageHeap 的中间层,其设计直接决定了内存分配的效率和并发性能。CentralCache 的核心职责是管理从 PageHeap 获取的大块内存,并将其拆分成适当大小的内存块供 ThreadCache 使用。
1.1 锁竞争优化策略
CentralCache 面临的最大挑战是如何在保证线程安全的前提下最小化锁竞争。经过多次性能测试对比,我最终选择了分桶锁(Bucket Lock)方案:
cpp复制class CentralCache {
private:
SpanList span_lists_[kNumClasses]; // 按大小分类的span列表
std::mutex locks_[kNumClasses]; // 每个size class独立锁
};
这种设计带来三个关键优势:
- 不同size class的操作完全并行
- 单个size class内部采用细粒度锁
- 锁范围精确控制在span操作层面
重要提示:锁粒度并非越细越好,过细的锁会导致频繁的加锁解锁开销。实测表明,按size class分组的锁粒度在8-256KB内存块范围内能达到最佳平衡。
1.2 内存碎片控制机制
CentralCache 通过两个关键策略控制内存碎片:
- 跨度合并:相邻空闲span及时合并
- 热span保持:每个size class保留至少2个活跃span
具体实现时需要注意:
cpp复制void CentralCache::ReleaseToSpanList(Span* span) {
std::lock_guard<std::mutex> lock(locks_[span->size_class]);
if (span->is_free) {
TryMergeWithNeighbors(span); // 尝试合并相邻span
}
span_lists_[span->size_class].PushFront(span);
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
