主页 > 开源代码  > 

Ubuntu下nginx-1.24.0源码分析-ngx_pnalloc函数

Ubuntu下nginx-1.24.0源码分析-ngx_pnalloc函数
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

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_palloc_small 函数-CSDN博客

调用大块内存分配函数 

return ngx_palloc_large(pool, size);

调用 ngx_palloc_large 函数进行大块内存分配

当请求的内存大小超过 pool->max 时,直接调用系统级的 malloc 分配内存。

分配的内存会被记录在内存池的大块内存链表中,以便在内存池销毁时统一释放


ngx_palloc_large

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_palloc_large 函数-CSDN博客

标签:

Ubuntu下nginx-1.24.0源码分析-ngx_pnalloc函数由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Ubuntu下nginx-1.24.0源码分析-ngx_pnalloc函数