任意大小 内存池 c语言,C语言内存池算法MTK任务内存申请和释放.pdf

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 __

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值