高并发内存池(六):释放内存全过程
在高并发内存池的设计中,释放内存是一个关键环节,直接影响内存池的性能和稳定性。释放内存的过程需要处理线程安全、内存碎片合并以及归还到全局内存池等问题。以下是一个完整的释放内存全过程的实现。
线程缓存释放内存
线程缓存(ThreadCache)是每个线程独享的内存缓存,用于快速分配和释放小块内存。释放内存时,首先将内存块归还到线程缓存中。
void ThreadCache::Deallocate(void* ptr, size_t size) {
assert(ptr && size <= kMaxSize);
// 计算对应的自由链表下标
size_t index = SizeClass::Index(size);
_freeLists[index].Push(ptr);
// 当自由链表的长度超过一定阈值,归还内存到中心缓存
if (_freeLists[index].Size() >= _freeLists[index].MaxSize()) {
ListTooLong(_freeLists[index], size);
}
}
中心缓存回收内存
当线程缓存的自由链表过长时,会将多余的内存块归还到中心缓存(CentralCache)。中心缓存负责平衡多个线程之间的内存分配。
void ThreadCache::ListTooLong(FreeList& list, size_t size) {
void* start = nullptr;
void* end = nullptr;
// 从自由链表中弹出一定数量的内存块
list.PopRange(start, end, list.MaxSize());
// 归还到中心缓存
CentralCache::GetInstance()->ReleaseListToSpan(start, size);
}
页缓存合并空闲内存
中心缓存将内存块归还到页缓存(PageCache)时,页缓存会尝试合并相邻的空闲页,以减少内存碎片。
742

被折叠的 条评论
为什么被折叠?



