构建自己的内存池(二)

内存池的实现:

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

你可能感兴趣的:(内存)