一、设计内存池原因:
c/c++ 内存管理是件让人头疼的事情: 分配足够的内存,追踪内存的分配,在不需要的时候释放内存,这些过程相当复杂,而且直接使用系统调用malloc/ free, new/delete 进行内存分配和释放,有如下问题:
- 内存碎片化: 频繁申请/释放内存,会造成内存碎片化,在分配大内存的时候,系统需要压缩内存空间,造成极大的系统开销;
- 内存泄漏: 频繁申请/释放内存会很可能导致内存泄漏,造成
- 开销大: 内存分配有一把全局锁,频繁调用会增大系统开销;
内存池的设计思想就是,先提前申请一定数量的内存块,当有内存需要的时候,先从这些内存中分配内存资源,如果内存块不够,则继续申请内存。这样的一个优点是:内存分配效率得到提升,尤其加快了小内存申请/释放
acl 内存池的设计就是为了解决小内存频繁申请释放,且这些内存块生命周期短(如一个http请求)
- 1 在申请内存时,通过先申请一块大内存,之后从这块大内存中不断给用户分配小内存。当一块内存页上的所有内存分配完,在申请一块大内存。
- 2 用户归还内存时,将使用该块内存页的用户减去1,当使用该内存页用户不存在的时候,我们就把这块大内存释放掉。
二、使用acl内存池
#incude “lib_acl.h”
int main(void) {
// 申请了一个8192长度的内存池
ACL_DBUF_POOL *dbuf = acl_dbuf_pool_create(8192);
char *huge_ptr; //大内存首地址
int i