小白一图看懂Nginx内存池结构
typedef struct ngx_pool_large_s ngx_pool_large_t;
struct ngx_pool_large_s{//大数据块
ngx_pool_large_t *next; //指向 下一个的大数据块
void *alloc; //大数据块地址
};
typedef struct{//数据块
u_char *last; //指向 待分配空间的首地址
u_char *end; //指向 数据块内存空间的结束位置
ngx_pool_t *next; //指向 下一个数据块首地址
ngx_uint_t failed; //保存 当前数据块 申请分配空间失败次数
} ngx_pool_data_t;
struct ngx_pool_s{//首数据块
ngx_pool_data_t d; //数据块 结构体
size_t max; //当前数据块最大可分配的内存大小(Byte)
ngx_pool_t *current; //指向 当前正在使用的内存池(当该内存池满时,将指向新申请的内存池last)
ngx_pool_large_t *large; //指向 大数据块首地址(当申请内存 > 当前数据块最大分配内存时,将申请大数据块内存)
};
第1步:创建一个内存池,内存池 首数据块 结构参数:增加了 max current large三个参数。
该内存池未满时current指针 指向自已的首地址(其他参数:见代码注释)
while(第2步 !直至该内存池不足时) {
第2步:在此内存池内申请数据块,每次申请大小不超过 (首数据块max值)
2.1:申请成功:该数据块 链到首数据块的 next指针上,该数据块next指向空。再申请时一直向后链连。
2.2:申请失败:将 申请大数据块并 链到首数据块 large指针上。该大数据块next指向空。
再申请时一直向后链接。
}
第3步:该内存池不足时,将会申请新的内存池,此时 前任内存池的current指针 将指向新内存池首地址。