欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

nginx源码初读(3)--让烦恼从main开始ngx_pool

程序员文章站 2022-06-09 17:49:29
...
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 ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了nginx源码初读(3)--让烦恼从main开始ngx_pool,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。