1. 系统功能封装
内存相关的操作主要在 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 下
其中 os/unix/ngx_alloc.{h,c} 封装了最基本的内存分配函数,是对c原有的malloc/free/memalign 等原有的函数的封装,对应的函数为:
- ngx_alloc 使用malloc分配内存空间
- ngx_calloc 使用malloc分配内存空间,并且将空间内容初始化为0
- ngx_memalign 返回基于一个指定的alignment大小的数值为对齐基数的空间
- ngx_free 对内存的释放操作
2. ngx的内存池
为了方便系统模块对内存的使用,方便内存的管理,nginx自己实现了进程池的机制来进行内存的分配和释放, 首先nginx会在特定的生命周期帮你统一建立内存池,当需要进行内存分配的时候统一通过内存池中的内存进行分配,最后nginx会在适当的时候释放内存池的资源,开发者只要在需要的时候对内存进行申请即可,不用过多考虑内存的释放等问题,大大提高了开发的效率。
内存池的主要结构为:
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; //内存池数据块的最大值
ngx_pool_t *current; //指向当前内存池
ngx_chain_t *chain; //该指针挂接一个ngx_chain_t结构
ngx_pool_large_t *large; //大块内存链表,即分配空间超过max的内存
ngx_pool_cleanup_t *cleanup; //释放内存池的callback
ngx_log_t *log; //日志信息
};
其中,sizeof(ngx_pool_data_t)=16B,sizeof(ngx_pool_t)=40B。