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