Linux(服务器编程):36---C/C++内存池设计(仿Nginx内存池设计)
一、内存池概述 服务器会频繁地对内存进行申请和释放,频繁地操作将带来如下的缺点: 服务器性能降低,因为需要频繁地申请和释放内存 内存碎片化多 等等...... 市场上开源的比较好用的内存池有: tcmalloc:MySQL使用的 jemalloc:Tomcat使用的 Nginx也有一套自己的内存池(本文就是仿照Nginx的内存池设计的) 二、内存池设计 因为内存页的大小为4K,因此在设计内存池的时候,我们将认为: <4k的内存:称为小内存块 >4K的内存:称为大内存快 struct mp_large_s(大内存块结构) 当我们申请的内存大于4K时,就会申请一个大的内存块,这个结构体就是大内存结构 该结构不是真正存储内存的,真正的内存是由其alloc成员所指向的 如上结构图所示(蓝色部分): alloc:指向真正的大内存块地址 next:指向下一个struct mp_large_s结构的指针 //大内存块节点 struct mp_large_s { void *alloc; //指向该大内存快的实际存储区域 struct mp_large_s *next; //指向下一块大内存快 }; struct mp_node_s(大内存块结构) 当我们申请的内存小于4K时,就会申请一个小的内存块,这个结构体就是小内存结构 与struct mp_large_s结构一样,该结构不是真正存储内存的