C语言内存池算法MTK任务内存申请和释放
MTK 的任务内存申请和释放,是事后类型的,必须用这样的方式申请和释放,比如有
mtk_task_malloc(void**p,int size); mtk_task_free(void **);
什么意思呢,就是说,p 在malloc 函数返回后那一刻,可能是空的,但是稍后任务在闲时会
分配内存给你,所以要用void**,而且,如果,你这样做的,可能会引起系统重启,即如有
下面的方法,实在很危险:
void mf_system_init()
{
char*p =NULL;
mtk_task_malloc((void **)&p,100);
...
mtk_task_free((void**)&p);
}
因为,要用任务申请,就必须保证传入void**的有效时间,至少在任务执行后,为此,你的
p,必须是全局的,或者static 的。这样的代码,不是每个人都能接受的,比如在p 的声明
前,加入static。
办法很简单,在系统初始化的时候,调用这个任务申请函数,得到一大块内存,然后,用我
的内存池,实现其他的,我们自己的MF_malloc 和MF_free,而这些函数与标准c 的接口,
基本一致,不需要多余的参数。下面将简单内存池的算法概述如下,需要说明的是,代码中,
有块重新划分的算法,对于处理离散的非连续的小内存块的效率不高,有待进一步优化。
我会在每个内存的开始位置,加上一个内存控制块,用于标示内存是否空闲,以及该块
的大小。用2 个指针标示内存的起始地址,以及最后一个可用内存的地址(未被使用过的)。
对于2 种情况,都会有内存块重新划分的动作,其一,当申请一块内存时,如果,找到一段
连续的、已经释放的小内存块,我会尝试重新标示该内存端,统一为一大块内存,用于满足
该次内存申请;其二,大申请的内存小于某一大块内存时,我会将该快内存切成两块内存。
这个简单的算法,实现很方便,不过,对于长时间使用,则有一定的效率问题,另外对于多
次申请释放小内存块,而且他们彼此又不连续的情况下,会造成很多的内存碎片。
h文件如下:
/**********************************************************************
*mf_mempool.h
*
* 简单的内存池
*
*======================================================
*HISTORY
*@Author @date@content @version
*
*JasonMa 2008/12/12memoryblock controlv1.0
*
*
**********************************************************************/
#ifndef MF_MEMPOOL_H
#define MF_MEMPOOL_H
#ifdef __cplusplus
extern"C" {
#endif
void MF_MP_Init(void *mem,mf_s32 block_size );
void MF_MP_Uninit( void );
void * MF_MP_malloc(mf_s32size );
void MF_MP_free( void * p);
#ifdef __cplusplus
}
#endif
#endif/*MF_MEMBLOCK_H*/
c 文件如下:
/**********************************************************************
*mf_mempool.c
*
* 简单的内存池
*
*======================================================
* HISTORY
* @Author @date @content @version
*
* JasonMa 2008/12/12 memoryblockcontrol v1.0
*
*
**********************************************************************/
#include "mf_macro.h"
#include "mf_base.h"
#ifdef __