内存池的实现与分析

本文探讨了内存池的重要性,尤其是在防止内存碎片和优化内存分配方面。它介绍了内存池的设计,如大块和小块内存的划分,以及如何通过tcmalloc和jemalloc等组件实现。以Nginx数据结构为例,展示了内存池在实际应用中的策略。
摘要由CSDN通过智能技术生成

1、为什么要有内存池

        软件工程师所说的内存都是虚拟内存;物理内存是接触不到的;

        比如文件系统中,fd描述符在内存中是每个进程都有一份这种临时状态的数据;fd文件描述符都是从0开始增长,每个进程都是一样的;

        我们在操作内存的时候,有两个是我们可以控制的;堆上的内存,栈是不能被操作的,共享内存段mmap这块内存空间;我们说的内存池是对堆上的内存进行管理;

        为什么需要对内存进行管理,为了防止内存碎片存在,以及避免频繁申请和释放内存;引入内存池tcmalloc/jemalloc;

        由于分配内存大小是不确定的,什么时候分配是不确定的,所以导致内存池针对不同场景实现的多样性;

        场景:

                多个客户端与服务器每建立一个连接,就分配一个内存池,每断开一个连接就释放一个内存池;

  2、内存池设计,如图所示

        将待分配的内存分为大块和小块;

                1)分配的大块内存占4k空间,并通过large指针以链表的形式串连起来;

                2)被小块分配的内存通过small指针以链表的形式串连起来;每个节点同样占4k内存,链表中的节点存放了该节点的4k内存中未使用的空间的起始地址和结束地址,用户需要分配比4k小的内存时,从对应节点的4k内存中按地址顺序获取未分配的内存,并修改该节点的4k内存中未使用的空间的起始地址;

        3)对应nginx的数据结构设计如图所示

3、可以使用tcmalloc和jemalloc这些开源组件,直接嵌入到项目中实现内存池;

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值