内存池的实现(一)

1.引言

  C/C++下内存管理是让几乎每个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不须要的时候释放内存——这个任务至关复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有如下弊端:html

    A.调用malloc/new,系统须要根据“最早匹配”、“最优匹配”或其余算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可能须要合并空闲内存块,这些会产生额外开销程序员

    B.频繁使用时会产生大量内存碎片,从而下降程序运行效率算法

    C.容易形成内存泄漏apache

  内存池(memory pool)是代替直接调用malloc/free、new/delete进行内存管理的经常使用方法,当咱们申请内存空间时,首先到咱们的内存池中查找合适的内存块,而不是直接向操做系统申请,优点在于:服务器

    A.比malloc/free进行内存申请/释放的方式快架构

    B.不会产生或不多产生堆碎片spa

    C.可避免内存泄漏操作系统

2.内存池设计

  看到内存池好处这么多,是否是恨不能立刻抛弃malloc/free,投奔内存池的怀抱呢?且慢,在咱们本身动手实现内存池以前还须要明确如下几个问题:.net

    A.内存池的空间如何得到?是程序启动时分配一大块空间仍是程序运行中按需求分配?设计

    B.内存池对到来的内存申请,有没有大小的限制?若是有,最小可申请的内存块为多大,最大的呢?

    C.如何合理设计内存块结构,方便咱们进行内存的申请、追踪和释放呢?

    D.内存池占用越多空间,相对应其余程序能使用的内存就越少,是否要设定内存池空间的上限?设定为多少合适呢?

  带着以上问题,咱们来看如下一种内存池设计方案。

3.内存池实现方案一

  从这里下载该内存池实现的源码。

  首先给出该方案的总体架构,以下:

内存池实现架构

                图1.内存池架构图

  结构中主要包含block、list 和pool这三个结构体,block结构包含指向实际内存空间的指针,前向和后向指针让block可以组成双向链表;list结构中free指针指向空闲 内存块组成的链表,used指针指向程序使用中的内存块组成的链表,size值为内存块的大小,list之间组成单向链表;pool结构记录list链表的头和尾。

4.内存跟踪策略

  该方案中,在进行内存分配时,将多申请12个字节,即实际申请的内存大小为所需内存大小+12。在多申请的12个字节中,分别存放对应的list指针(4字节)、used指针(4字节)和校验码(4字节)。经过这样设定,咱们很容易获得该块内存所在的list和block,校验码起到粗略检查是否出错的做用。该结构图示以下:

结点头12字节说明

            图2.内存块申请示意图

图中箭头指示的位置为内存块真正开始的位置。

5.内存申请和释放策略

5.1 申请

  申请:根据所申请内存的大小,遍历list链表,查看是否存在相匹配的size;

    A.存在匹配size:查看free时候为NULL

      free为NULL:使用malloc/new申请内存,并将其置于used所指链表的尾部

      free不为NULL:将free所指链表的头结点移除,放置于used所指链表的尾部

    B.不存在匹配size:新建list,使用malloc/new申请内存,并将其置于该list的used所指链表尾部

      返回内存空间指针

5.2 释放

  释放:根据内存跟踪策略,获取list指针和used指针,将其从used指针所指的链表中删除,放置于free指针所指向的链表

6.对方案一的分析

  对照“内存池设计”一节中提出的问题,咱们的方案一有如下特色:

    A.程序启动后内存池并无内存块,到程序真正进行内存申请和释放的时候才接管内存块管理;

    B.该内存池对到来的申请,对申请大小并不作限制,其为每一个size值建立链表进行内存管理;

    C.该方案没有提供限定内存池大小的功能

  结合分析,能够得出该方案应用场景以下:程序所申请的内存块大小比较固定(好比只申请/释放1024bytes或2048bytes的内存),申请和释放的频率基本保持一致(因申请多而释放少会占用过多内存,最终致使系统崩溃)。

   这篇文章讲解了内存管理的基本知识,以一个简单的内存池实现例子做为敲门砖,引领你们认识内存池,下一篇为内存池进阶文章,讲解apache服务器中内存池的实现方法。

 

原文连接:http://www.cnblogs.com/bangerlee/archive/2011/08/31/2161421.html

相关文章
相关标签/搜索