前言
Nginx事件模块中在分配存储配置项参数的结构体时需要从内存池中分配内存,然后看代码的时候觉得这一块可以好好研究下。网上一搜果然是有大量的文章,所以就学习笔记下。这里推荐阿里数据平台的博文《Nginx源码分析-内存池》。
Nginx内存池的设计也是蛮漂亮的,大块内存以及小块内存都有考虑到,这里很需要学习其思想,以后非常有可能会用到。
Nginx内存池的设计也是蛮漂亮的,大块内存以及小块内存都有考虑到,这里很需要学习其思想,以后非常有可能会用到。
内存池创建
对于内存池的结构,我们可以暂且将其分为头部以及数据域两部分,代码如下:
<span style="font-family:SimSun;font-size:18px;">struct ngx_pool_s {
ngx_pool_data_t d; // 数据域部分,小块内存在此分配
size_t max; // 整个数据块的大小,亦即能够分配的小块内存最大值
ngx_pool_t *current; // 指向当前内存池
ngx_chain_t *chain; // 可以挂载一个chain结构
ngx_pool_large_t *large; // 当分配的内存超过max值时,即分配大块内存时,使用该成员,属于数据域部分
ngx_pool_cleanup_t *cleanup; // 当内存池释放的时候,同时需要释放的一些资源使用该成员
ngx_log_t *log; // 日志
};
typedef struct {
u_char *last; // 当前内存分配结束位置,亦即下一段内存分配开始位置
u_char *end; // 内存池结束位置
ngx_pool_t *next; // 链接下一个内存池
ngx_uint_t failed; // 该数据域部分不能满足分配内存的次数
} ngx_pool_data_t;</span>
内存池创建的代码如下:
<span style="font-family:SimSun;font-size:18px;">ngx_pool_t *
ngx_create_pool(size_t size,