内存池的实现与场景分析

内存池通过集中管理内存分配,旨在减少频繁分配与释放造成的内存碎片。本文介绍了内存池如jemalloc、tcmalloc的使用,并探讨了避免内存碎片的策略,包括使用链表、固定大小内存块及STL的分配方式。同时,分析了内存池的缺点,如链表查找效率低,以及可能出现的内存间隙问题。最后,列举了内存池的常见应用场景,如全局内存池、按连接或消息创建的内存池。
摘要由CSDN通过智能技术生成

内存池是对malloc在堆上申请出来的空间进行的管理!

内存池作用:(内存池要用但不要自己造,要懂他的原理)

避免频繁分配内存(recv之前malloc一块空间,让recv函数来用,这种方式内存会被频繁分配释放和使用,会造成内存碎片化,这样当我们再次申请一块大内存的时候会遇到分配失败的情况。)

内存池:jemalloc,tcmalloc

避免频繁分配与释放方法:

1. 使用链表,每次malloc把块加入到链表中,不释放,调用free的时候直接在结构体里设置一个flag

struct memnode {
    void *addr;
    int size;
    int flag;//1用0free
    struct memnode *next;
};

struct memnode *mempool;

void *nmalloc(void) {

    search
    void *addr = malloc();
    struct memnode *node;
    ADD(mempool, node);
}

void free(void *addr) {
}

2. 分配固定大小块,第一个分配16字节,第二个分配32字节……第6个分配512字节。直接for循环看当前需要的内存块比谁小,这种方式可以防止到后期链表越来越长的现象。这种是为了避免内存碎片,所以大于512的块就直接malloc就好。(这种方式让我想起了STL的alloc)

3. 感觉就是STL的alloc分配方式了,一个数组里每个元素挂一个内存队列,先查找是否能找到能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值