标签:
关于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时候,就不会在内存池中分配内存,会另外分配一块大的内存供程序使用
标签:
原文地址:http://www.cnblogs.com/yimuren/p/4427832.html