nginx内存池:ngx_pool_t,二级内存分配器
nginx基本容器,包括:
- 数组,ngx_array_t
- 链表,ngx_list_t
- 队列,ngx_queue_t
- 哈希表,ngx_hash_t
- 通配符哈希表,ngx_hash_wildcard_t
一、nginx内存池
参考nginx源码分析—内存池结构ngx_pool_t及内存管理,特点:
- 与STL的空间配置器类似,有两级配置,仅提供了释放大内存块的接口,小内存只分配不释放,要么释放整个内存池(nginx进程中有茫茫多内存池)
- 内存池由三部分组成:小块内存形成的链表(并不是ngx_list_t)、大块内存形成的链表、以及挂载了一些内存池释放同时释放的资源(到底是啥,待补充)
- 其中小块内存链表每个格子大小相同,剩余空间不足时再申请格子挂在该链表里,这里有个特别的点:每个当前格子有个失败计数器,在给调用方分配内存时只有当计数器>4后再调整当前格子为下一个格子,目的是当前格子虽然不满足分配需求,但也有剩余,可能满足下一次分配
二、ngx_array_t
nginx中的数组容器,参考nginx源码分析—数组结构ngx_array_t,应用非常广泛
// 动态数组
struct ngx_array_s {
// elts指向数组的首地址
void *elts;
// nelts是数组中已经使用的元素个数
ngx_uint_t nelts;
// 每个数组元素占用的内存大小
size_t size;
// 当前数组中能够容纳元素个数的总大小
ngx_uint_t nalloc;
// 内存池对象
ngx_pool_t *pool;
};
ngx_array_push(ngx_array_t *a)