
内存映射准备
当 ThreadCache 将内存块归还给 CentralCache 时,这些块需要挂回对应的 Span。既然它们原本属于某个 Span,逻辑上理应回归原处。为了支持这一操作,必须建立从内存对象地址到 Span 的映射关系。
由于 Span 是由 PageCache 分配给 CentralCache 的,PageCache 最清楚 Span 与页 ID 的关系。因此,我们在 PageCache 中新增一个哈希表,用于快速查找对象所属的 Span。
class PageCache {
public:
static PageCache* GetInstance() { return &_sInst; }
// 获取从对象到 span 的映射
Span* MapObjectToSpan(void* obj);
// 释放空闲 span 回到 Pagecache,并合并相邻的 span
void ReleaseSpanToPageCache(Span* span);
// 获取一个 K 页的 span
Span* NewSpan(size_t k);
std::mutex _pageMtx;
private:
SpanList _spanLists[NPAGES];
std::unordered_map<PAGE_ID, Span*> _idSpanMap; // 哈希表:页 ID 到 Span 的映射关系
PageCache() {}
PageCache(const PageCache&) = delete;
static PageCache _sInst;
};
Span* PageCache::MapObjectToSpan(void* obj) {
PAGE_ID id = ((PAGE_ID)obj >> PAGE_SHIFT);
auto ret = _idSpanMap.find(id);
if (ret != _idSpanMap.()) {
ret->second;
} {
();
;
}
}



