由于glibc库自带的malloc/free最终是需要访问操作系统的,
严重时会使机器运行缓慢。同时由于系统采用伙伴算法,
会不可不免的有内存碎片产生。
而内存池能在一定程度上改善上述问题,
下面从原理、实现、使用的角度浅谈一下。
原理
- 使用malloc一次从系统申请一块大内存,如1024MB
uinit_8 buffer = malloc(1024*1024*1024);//分配1G内存
- 使用伙伴算法管理该内存,典型做法额外malloc分配一个管理数组
- 锚定伙伴算法管理的最小内存单元,如4k.
即使用户申请1个字节内存,该池最小也分配4k内存。
这样粒度较粗有利于提高管理的效率 - 用户使用,类似如下代码
uint8 buffer = getBuffer(size_t size); //申请内存
int len = putBuffer(char* buf, int len);//往内存里面写入len字节数据
release(char *buf); //释放内存
设计
实现伙伴算法对内存的管理,开放申请、释放、
往内存中填充数据等接口,尽可能的封装在一个
库或者一个公共接口中另外按需实现一些调试接口,如剩余内存,总内存,内存地址,
实际申请的内存和实际分配的内存等- 增加引用计数
使用
- 用户只需调用getBuffer/putBuffer/release等操作
即可替代原来的系统函数