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


    内存池的实现:

    1:内存池的初始化:对每个子池进行初始化流程,将子池的入口放入内存池中,初始化block状态。

    void initPools()
    {
        initPool(POOL1,(void*)pool1,POOL1_BLOCK_NUM,POOL1_BLOCK_SIZE);
        initPool(POOL2,(void*)pool2,POOL2_BLOCK_NUM,POOL2_BLOCK_SIZE);
        initPool(POOL3,(void*)pool3,POOL3_BLOCK_NUM,POOL1_BLOCK_SIZE);
        return;
    }

    void initPool(unsigned char poolId,void *pool,unsigned short blockNum,unsigned short blockSize)
    {
        BLOCK_M_T *pBmt = NULL;
        BLOCK_M_T *pPreBmt = NULL;

        g_memoryPools[poolId].blockSzie = blockSize;
        g_memoryPools[poolId].blockUsed = 0;
        g_memoryPools[poolId].pFirstBlock = (BLOCK_M_T*)pool;

        pBmt = (BLOCK_M_T*)pool;
        for(int i=0;i<blockNum;i++)
        {
            pBmt->payload = 0;
            pBmt->state = BLOCK_UNUSED|poolId;
            pBmt->pNext = (BLOCK_M_T*)((unsigned char*)(pBmt+1)+blockSize);
            pPreBmt = pBmt;
            pBmt = pBmt->pNext;
        }

        pPreBmt->pNext = NULL;
        return;
    }

     2:内存空间的分配:从指定的子池中获取空闲的block,子池中包含所有的未被分陪的block,每分配一个block后,子池中将不在包含该block。

    void* getPoolBlock(unsigned char poolId,unsigned short size)
    {
        BLOCK_M_T *pBmt = NULL;
    
        pBmt = (BLOCK_M_T*)g_memoryPools[poolId].pFirstBlock;
    
        if(!pBmt)
        {
            return NULL;
        }
    
        g_memoryPools[poolId].pFirstBlock = pBmt->pNext;
        pBmt->state = BLOCK_USED|poolId;
        pBmt->payload = size;
        pBmt->pNext = NULL;
    
        return (pBmt+1);
    }

    3:内存空间的释放:根据实际分配空间的地址可以定位到相应的block管理头,根据block管理头中的状态信息可以确定对应的子池,修改block状态然后将该block挂接到对应子池的头上。供下次分配。

    void memPools_free(void* pBlock)
    {
        BLOCK_M_T *pBmt = NULL;
        unsigned short poolId = -1;
     
        pBmt = (BLOCK_M_T*)pBlock;
    
        pBmt--;
        poolId = pBmt->state & 0x3F;
    
        pBmt->payload = 0;
        pBmt->state = BLOCK_UNUSED|poolId;
        pBmt->pNext = g_memoryPools[poolId].pFirstBlock;
        g_memoryPools[poolId].pFirstBlock = pBmt;
    
        return;
    }

    这只是一个简单内存池实现,实际的应用中可能还要考虑到效率并加上相关的调试的功能。但其包含了内存池管理的基本思想。

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

  • 相关阅读:
    XML注释
    Mysql 查询不重复数据
    java 支持跨域
    蓝桥杯历届试题-打印十字图--Java
    以流的方式读取url中的参数
    写log日志,并读取log日志
    Java Memcached的使用
    PageInfo实现分页
    java swing 窗口在屏幕中默认显示的位置 居中位置显示
    简易计算器布局 BorderLayout JPanel GridLayout 混合
  • 原文地址:https://www.cnblogs.com/chencheng/p/2558783.html
Copyright © 2020-2023  润新知