内存池实现与分析
内存池实现与分析 描述 程序中不可避免的因为需要动态分配内存,而大量使用堆上的内存。如果使用系统默认的函数new/delete或malloc/free来分配和释放堆上的内存,效率不高,同时还可能产生大量的内存碎片,导致长时间运行后性能愈发下降。为了提高性能,通常就需要考虑使用一些数据结构和算法来减少动态分配的发生,这也是内存池这个思想的来源。 在我们的服务器里,可以看到大量频繁申请和销魂内存的情况发生在接收处理网络数据的部分里,所以在这一部分的处理中我们就需要考虑使用内存池来优化性能。 算法思想 首先使用的方法是类似 SGI STL 中的 allocator 内存分配器的实现方式。设计了一个数组,负责管理内存页(MemPage)。每一个内存页都可分配连固定大小,范围在 8Bytes 到 64MBytes 之间的内存块。 内存块是在创建MemPage申请的一段连续大小的空间,同时另外用一个数组记录每个块所在的内存地址,分配的时候分配空闲的内存空间,释放的时候通过修改数组指向的位置达到释放的目的。 结构如下: 实现细节 首先定义的结构大小限制如下: #define _MIN_BLOCK_SIZE_ (8) //单内存块最小限制为8 Byte #define _MAX_BLOCK_SIZE_ (1 << 26 ) //单内存块最大限制为64 MByte #define _PAGE_MIN