创建一个内存池
函数源码如下
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
ngx_pool_t *p;
/*NGX_POOL_ALIGNMENT大小对齐,分配size大小内存,返回地址为NGX_POOL_ALIGNMENT的整数倍*/
p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
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;
}
从内存池中取可用内存分配给变量,源码如下
void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
u_char *m;
ngx_pool_t *p;
if (size <= pool->max) {/*判断申请额度是否超过最大值,是则申请大块内存*/
p = pool->current;
/*分配size大小的内存,如果不够则再开辟*/
do {
m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
if ((size_t) (p->d.end - m) >= size) {
p->d.last = m + size;
return m;
}
p = p->d.next;
} while (p);
return ngx_palloc_block(pool, size);/*无够用内存池新开一个内存池*/
}
return ngx_palloc_large(pool, size);/*超出最大值新开一个大内存池*/
}
总结,nginx内存管理总体思路,建立一个内存池结构体,记录当前的内存池详细情况,够用则从内存池链表中取出内存分配给变量使用,不够则重新开辟内存池,如果分配的变量太大,则新开辟大额内存池