1、为什么要有内存池
软件工程师所说的内存都是虚拟内存;物理内存是接触不到的;
比如文件系统中,fd描述符在内存中是每个进程都有一份这种临时状态的数据;fd文件描述符都是从0开始增长,每个进程都是一样的;
我们在操作内存的时候,有两个是我们可以控制的;堆上的内存,栈是不能被操作的,共享内存段mmap这块内存空间;我们说的内存池是对堆上的内存进行管理;
为什么需要对内存进行管理,为了防止内存碎片存在,以及避免频繁申请和释放内存;引入内存池tcmalloc/jemalloc;
由于分配内存大小是不确定的,什么时候分配是不确定的,所以导致内存池针对不同场景实现的多样性;
场景:
多个客户端与服务器每建立一个连接,就分配一个内存池,每断开一个连接就释放一个内存池;
2、内存池设计,如图所示
将待分配的内存分为大块和小块;
1)分配的大块内存占4k空间,并通过large指针以链表的形式串连起来;
2)被小块分配的内存通过small指针以链表的形式串连起来;每个节点同样占4k内存,链表中的节点存放了该节点的4k内存中未使用的空间的起始地址和结束地址,用户需要分配比4k小的内存时,从对应节点的4k内存中按地址顺序获取未分配的内存,并修改该节点的4k内存中未使用的空间的起始地址;
3)对应nginx的数据结构设计如图所示
3、可以使用tcmalloc和jemalloc这些开源组件,直接嵌入到项目中实现内存池;