Content 0. 序 1. 内存池结构 1.1 ngx_pool_t 结构 1.2 其他相关结构 1.3 ngx_pool_t 的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2.3 重置内存池 2.4 分配内存 2.4.1 ngx_palloc()函数分析 2.4.2 ngx_palloc_block()函数分析 2.5 释放内存 2.6 注册cleanup 2.7 内存池的物理结构 3. 一个例子 3.1 代码 3.2 如何编译 3.3 运行结果 4. 小结 5. 致谢 0. 序 nginx 对内存的管理由其自己实现的内存池结构ngx_pool_t 来完成,本文重点叙述nginx 的内存管理。 nginx 内存管理相关文件: (1) ./src/os/unix/ngx_alloc.h/.c 内存相关的操作,封装了最基本的内存分配函数 如 free/malloc/memalign/posix_memalign,分别被封装为 ngx_free,ngx_alloc/ngx_calloc, ngx_memalign ngx_alloc:封装 malloc 分配内存 ngx_calloc:封装 malloc 分配内存,并初始化空间内容为 0 ngx_memalign:返回基于一个指定 alignment 的大小为 size 的内存空间,且其地址为 alignment 的整数倍,alignment 为 2 的幂。 (2) ./src/core/ngx_palloc.h/.c 封装创建/销毁内存池,从内存池分配空间等函数 .表示 nginx-1.0.4 代码目录,本文为/usr/src/nginx-1.0.4。 1. 内存池结构 nginx 对内存的管理均统一完成,例如,在特定的生命周期统一建立内存池(如main 函数系统启动初期即分配1024B 大小的内存池),需要内存时统一分配内存池中的内存,在适当的时候释放内存池的内存(如关闭http 链接时调用ngx_destroy_pool 进行销毁)。 因此,开发者只需在需要内存时进行申请即可,不用过多考虑内存的释放等问题,大大提高了开发的效率。先看一下内存池结构。 1.1 ngx_pool_t 结构 此处统一一下概念,内存池的数据块:即分配内存在这些数据块中进行,一个内存池可以有多一个内存池数据块。nginx 的内存池结构如下。 00048: typedef struct { 00049: u_char *last; //当前内存池分配到此处,即下一次分配从此处开始 00050: u_char *end; //内存池结束位置 00051: ngx_pool_t *next; //内存池里面有很多块内存,这些内存块就是通过该指针连成链表的 00052: ngx_uint_t failed; //内存池分配失败次数 00053: } ngx_pool_data_t; //内存池的数据块位置信息 00054: 00055: 00056: struct ngx_pool_s{ //内存池头部结构 ...