nginx源码初读(3)–让烦恼从main开始ngx

nginx_pool提供了一种资源管理机制(如内存,文件等),使得对资源的使用和释放统一进行,免除了资源释放的很多问题,开发者只需在需要内存时进行申请即可,不用过多考虑内存的释放等问题,大大提高了开发的效率。

例如,在特定的生命周期统一建立内存池(如main函数系统启动初期即分配1024b大小的内存池),需要内存时统一分配内存池中的内存,在适当的时候释放内存池的内存(如关闭http链接时调用ngx_destroy_pool进行销毁)。

typedefstruct ngx_pool_s ngx_pool_t;
typedefstruct ngx_pool_cleanup_s ngx_pool_cleanup_t;
typedefvoid (*ngx_pool_cleanup_pt)(void *data);
struct ngx_pool_cleanup_s {
ngx_pool_cleanup_pt handler;
void *data;
ngx_pool_cleanup_t *next;
};
typedefstruct ngx_pool_large_s ngx_pool_large_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next;
void *alloc;
};
typedefstruct {
u_char *last;
u_char *end;
/* 分别指当前内存池的分配位置(下次从last分配内存)和结束位置(内存用光啦)
* if ((size_t) (p->d.end – m) >= size) {
p->d.last = m + size;
return m;
}
*/ ngx_pool_t *next;
/* 指向下一个pool内存块(当pool内存不足的时候会调用palloc_block来创建一块新的pool并分配内存)
* psize = (size_t) (pool->d.end – (u_char *) pool);
m = ngx_memalign(ngx_pool_alignment, psize, pool->log);
new = (ngx_pool_t *) m;
p->d.next = new;
*/ ngx_uint_t failed;
/* 当前block内存分配失败次数,从这段代码看应该current是用来记录要创建内存块的搜索位置?
因为它记录了从这一块开始内存不够用,而failed是为了重定向current而存在的,减少遍历数量(在4以内)
* for (p = pool->current; p->d.next; p = p->d.next) {
if (p->d.failed++ > 4) {
pool->current = p->d.next;
}
}
*/
} 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_pool_large_t *large;
ngx_pool_cleanup_t *cleanup;
ngx_log_t *log;
};

‘).addclass(‘pre-numbering’).hide();
$(this).addclass(‘has-numbering’).parent().append($numbering);
for (i = 1; i

Posted in 未分类