高并发内存池(六):释放内存全过程搭建。

高并发内存池(六):释放内存全过程

在高并发内存池的设计中,释放内存是一个关键环节,直接影响内存池的性能和稳定性。释放内存的过程需要处理线程安全、内存碎片合并以及归还到全局内存池等问题。以下是一个完整的释放内存全过程的实现。

线程缓存释放内存

线程缓存(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)时,页缓存会尝试合并相邻的空闲页,以减少内存碎片。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值