码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx源码研究二:NGINX的内存管理

时间:2015-04-15 11:01:05      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

关于nginx的内存使用,我们先看代码,下面是nginx_cycle.c中对全局数据结构cycle的初始化过程

    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); //申请16K的内存池
    if (pool == NULL) {
        return NULL;
    }
    pool->log = log;

    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
    if (cycle == NULL) {
        ngx_destroy_pool(pool);
        return NULL;
    }


我们可以看到,nginx对内存分配做了封装,第一步:申请内存池;第二步:在内存池中分配内存。我们分别来看一下

1、内存池的申请

看一下ngx_create_pool(NGX_CYCLE_POOL_SIZE, log) 函数

 

ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;

    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); //实际分配size大小的内存
    if (p == NULL) {
        return NULL;
    }

    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    p->d.end = (u_char *) p + size;
    p->d.next = NULL;
    p->d.failed = 0;

    size = size - sizeof(ngx_pool_t);
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; 
    p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;

    return p;
}

 

内存池定义了一个max的成员变量,我们从后面使用内存池分配内存可以看到,这个max成员变量,实际上确定了该段申请的内存使用的大小。max的大小不大于内存的分页大小,目的是优化内存的存取。同时程序一旦请求内存大于max时候,就不会在内存池中分配内存,会另外分配一块大的内存供程序使用

 

Nginx源码研究二:NGINX的内存管理

标签:

原文地址:http://www.cnblogs.com/yimuren/p/4427832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!