时间:2021-07-01 10:21:17 帮助过:6人阅读
例如,在特定的生命周期统一建立内存池(如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 <= lines; i++) {
$numbering.append($('').text(i));
};
$numbering.fadeIn(1700);
});
});
以上就介绍了nginx源码初读(3)--让烦恼从main开始ngx_pool,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。