ngx_pnalloc
声明在 src\core\ngx_palloc.h
void *ngx_pnalloc(ngx_pool_t *pool, size_t size);
定义在 src\core\ngx_palloc.c
void * ngx_pnalloc(ngx_pool_t *pool, size_t size) { #if !(NGX_DEBUG_PALLOC) if (size <= pool->max) { return ngx_palloc_small(pool, size, 0); } #endif return ngx_palloc_large(pool, size); }
Nginx 的内存池是一种分层的内存管理机制,主要分为小块内存分配和大块内存分配两种模式:
- 小块内存分配 :从预先分配的内存块中分配内存,避免频繁调用系统级的
malloc
和free
。- 大块内存分配 :直接调用系统级的
malloc
分配大块内存,适用于超出小块内存分配范围的情况。这种设计的目标是减少内存碎片、提高分配效率,并通过集中管理内存生命周期来简化内存释放操作
该函数的作用是从指定的内存池中分配一块大小为
size
的内存。根据分配的大小,它会选择不同的分配策略(小块或大块)
函数原型
void *ngx_pnalloc(ngx_pool_t *pool, size_t size);
参数说明 :
pool
:指向当前内存池的指针。size
:需要分配的内存大小。返回值 :
- 成功时返回分配的内存地址。
- 失败时返回
NULL
。
预处理宏
#if !(NGX_DEBUG_PALLOC)
#if !(NGX_DEBUG_PALLOC)
这是一个条件编译指令,用于控制是否启用调试模式
- 如果未定义
NGX_DEBUG_PALLOC
宏,则执行后续代码。- 如果定义了
NGX_DEBUG_PALLOC
,则跳过这部分代码,直接进入大块内存分配逻辑
判断内存大小是否适合小块分配
if (size <= pool->max) {
判断请求的内存大小是否小于等于
pool->max
pool->max
是内存池的一个属性,表示小块内存分配的最大限制。如果
size
小于等于pool->max
,说明可以从小块内存池中分配。
调用小块内存分配函数
return ngx_palloc_small(pool, size, 0);
调用
ngx_palloc_small
函数进行小块内存分配。
- 参数说明 :
pool
:当前内存池。size
:需要分配的内存大小。0
:表示不进行对齐操作(即按需分配,无需额外填充)
ngx_palloc_small
是一个小块内存分配器,它会尝试从内存池的空闲链表中分配内存。如果当前内存池的空闲空间不足,则会创建一个新的内存块并挂载到内存池中。
ngx_palloc_small
调用大块内存分配函数
return ngx_palloc_large(pool, size);
调用
ngx_palloc_large
函数进行大块内存分配当请求的内存大小超过
pool->max
时,直接调用系统级的malloc
分配内存。分配的内存会被记录在内存池的大块内存链表中,以便在内存池销毁时统一释放
ngx_palloc_large