ngx_pool_t:
typedef struct ngx_pool_s ngx_pool_t;
struct ngx_pool_s { // 内存池的管理分配模块
ngx_pool_data_t d; // 内存池的数据块
size_t max; // 数据块大小,小块内存的最大值
ngx_pool_t *current; // 指向内存池可用数据块
ngx_chain_t *chain; // 该指针挂接一个ngx_chain_t结构
ngx_pool_large_t *large; // 指向大块内存分配,nginx中,大块内存分配直接采用标准系统接口malloc
ngx_pool_cleanup_t *cleanup; // 析构函数,挂载内存释放时需要清理资源的一些必要操作
ngx_log_t *log; // 内存分配相关的日志记录
};
ngx_pool_data_t:
typedef struct { // 内存池的数据结构模块
u_char *last; // 当前内存分配结束位置,即下一段可分配内存的起始位置
u_char *end; // 内存池的结束位置
ngx_pool_t *next; // 链接到下一个内存池,内存池的很多块内存就是通过该指针连成链表的
ngx_uint_t failed; // 记录内存分配不能满足需求的失败次数,当失败次数大于指定值时 current 指向下一内存池单元
} ngx_pool_data_t; // 结构用来维护内存池的数据块,供用户分配小块内存使用。
Nginx的内存池分为两个部分,一种是小块内存,一种是大块内存。小块内存指的是last所指向的位置,大块内存则需要重新开辟,由large指向。在需要开辟新的内存时,当传入内存大小大于max值时,在large中查找(如果向后查三个都没有找到合适的内存块,则开辟新的内存块并加入链表),反之,在last所指内存中查找。当小块内存不够时,会开辟新的内存块,由next指针指向。
当需要销毁内存时,大块内存直接用ngx_free释放,小块则不做处理,只有在销毁整个内存池时才会处理。
内存池的销毁步骤:
调用所有cleanup函数,清理数据
释放所有大块内存
释放所有内存池中的内存块