当前位置:Gxlcms > PHP教程 > nginx源码初读(3)--让烦恼从main开始ngx_pool

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

时间:2021-07-01 10:21:17 帮助过:6人阅读

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 <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

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

  • 人气教程排行