nginx_pool提供了一种资源管理机制(如内存,文件等),使得对资源的使用和释放统一进行,免除了资源释放的很多问题,开发者只需在需要内存时进行申请即可,不用过多考虑内存的释放等问题,大大提高了开发的效率。
例如,在特定的生命周期统一建立内存池(如main函数系统启动初期即分配1024B大小的内存池),需要内存时统一分配内存池中的内存,在适当的时候释放内存池的内存(如关闭http链接时调用ngx_destroy_pool进行销毁)。
<code><span>typedef</span><span>struct</span> ngx_pool_s ngx_pool_t;
<span>typedef</span><span>struct</span> ngx_pool_cleanup_s ngx_pool_cleanup_t;
<span>typedef</span><span>void</span> (*ngx_pool_cleanup_pt)(<span>void</span> *data);
<span>struct</span> ngx_pool_cleanup_s {
ngx_pool_cleanup_pt handler;
<span>void</span> *data;
ngx_pool_cleanup_t *next;
};
<span>typedef</span><span>struct</span> ngx_pool_large_s ngx_pool_large_t;
<span>struct</span> ngx_pool_large_s {
ngx_pool_large_t *next;
<span>void</span> *alloc;
};
<span>typedef</span><span>struct</span> {
u_char *last;
u_char *end;
<span>/* 分别指当前内存池的分配位置(下次从last分配内存)和结束位置(内存用光啦)
* if ((size_t) (p->d.end - m) >= size) {
p->d.last = m + size;
return m;
}
*/</span> ngx_pool_t *next;
<span>/* 指向下一个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;
*/</span> ngx_uint_t failed;
<span>/* 当前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;
}
}
*/</span>
} ngx_pool_data_t;
<span>struct</span> 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 *<span>log</span>;
};
</code>以上就介绍了nginx源码初读(3)--让烦恼从main开始ngx_pool,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号