实现思路(分而治之)
对于每个请求或者连接都会建立相应的内存池,建好后,我们可直接从内存池中申请所需的内存,当内存池使用完成后,一次性释放内存池
区分大小内存块的申请和释放,大于池尺寸的定义为大内存块,使用单独的大内存块链表保存,及时分配和释放;小于等于池尺寸的定义为小内存块,直接从预先分配的内存块中提取,不够就扩充内存池中的内存,在生命周期内不做释放,直到最后统一销毁
关键数据结构
typedef struct{
u_char* last; //保存当前数据块中内存分配指针的当前位置
u_char* end; //保存内存块的结束位置
ngx_pool_t* next; //内存池由多个内存块组成,指向下一个数据块的位置
ngx_uint_t falied; //当前数据块内存不足引起分配失败的次数
}ngx_pool_data_t;
typedef ngx_pool_s{
ngx_pool_t d;//内存池当前数据指针的结构体
size_t max;//当前数据块可最大可分配的内存大小
ngx_pool_t* current;//当前正在使用的数据块的指针
ngx_pool_large_t* large;//pool中指向大数据块的指针(size>max)
};
struct ngx_pool_large_s{
ngx_pool_large_t *next; //指向下一块大内存
void *alloc; //大内存起始地址
}
内存申请(对齐) void* ngx_palloc(ngx_pool_t* pool,size_t size);
申请内存(不对齐) void* ngx_pnalloc(ngx_pool_t* pool,size_t size);
内存申请(对齐并初始化) void* ngx_pcalloc(ngx_pool_t* pool,size_t size);
内存清除 ngx_int_t ngx_pfree(ngx_pool_t,void* p);