• 构建自己的内存池(一)


    开发人员往往会自己使用平台提供的内存分配函数分配自己想要的内存空间,但某些嵌入式平台可能并不提供相应的内存管理机制,对于系统分配的一大块内存地址空间,为了有效的对其进行管理,这就需要我们构建自己的内存池管理模块。了解了基本的内存分配机制,对项目中内存相关问题的定位也是有相当的好处。

    基本思想:

    1:一个内存池代表一个待管理的内存区域(MemoryPools)。

      
    2:对MemoryPools进行细分为N个子pool,每个pool根据实际的需要进行大小分配。它的大小取决于该池中内存块的大小和个数。

      

    3:对每个子pool再进行划分为实际为实际进行分配的内存块,每个子池中的所有block具有相同的大小,不同子pool包含block个数不相等,小池的block个数多,但容量较小。因为在实际的应用中往往我们申请小内存空间的概率更大,但根据实际的项目需要也可以动态的调整。

      

    4:对一个子池中的block我们需要划分出一小块空间来作为管理的用途,主要用来记录状态和进行block间的关联。

      

     相关数据结构定义:

    1:block管理结构定义:

    typedef struct BLOCK_M_S BLOCK_M_T;
    struct BLOCK_M_S
    {
        BLOCK_M_T     *pNext;       //下一个block
        unsigned short state;       //当前block的使用状态
        unsigned short payload;     //当前block的负载
    };

     2:子池管理结构定义:

    typedef struct POOL_M_S POOL_M_T;
    struct POOL_M_S
    {
        BLOCK_M_T       *pFirstBlock;  //第一个block
        unsigned short  blockSzie;     //池中block大小
        unsigned short  blockUsed;     //已经使用的block个数
    };

     3:内存池定义

    /*内存池大小*/
    #define POOL1_SIZE (POOL1_BLOCK_NUM*(POOL1_BLOCK_SIZE+sizeof(BLOCK_M_T)))
    #define POOL2_SIZE (POOL2_BLOCK_NUM*(POOL2_BLOCK_SIZE+sizeof(BLOCK_M_T)))
    #define POOL3_SIZE (POOL3_BLOCK_NUM*(POOL3_BLOCK_SIZE+sizeof(BLOCK_M_T)))
    /*内存池空间*/
    static unsigned char pool1[POOL1_SIZE];
    static unsigned char pool2[POOL2_SIZE];
    static unsigned char pool3[POOL3_SIZE];
    static POOL_M_T g_memoryPools[MAXPOOLNUM]={0};

     今天先写到这里,后续继续描叙详细的实现过程

    转载请注明原始出处:http://www.cnblogs.com/chencheng/archive/2012/06/20/2557115.html

  • 相关阅读:

    python 爬取可用
    安装完出现Deprecated: Function ereg_replace() is deprecated in
    mysql数据库还原出错ERROR:Unknown command ‘\’解决手记
    mysql 常用语句
    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 解决方法
    js 中 json对象 与 json字符串 间相互转换
    神器 Sublime Text 3 的一些常用快捷键
    神器 Sublime Text 3 的一些常用插件
    apache php gzip压缩输出的实现方法
  • 原文地址:https://www.cnblogs.com/chencheng/p/2557115.html
Copyright © 2020-2023  润新知