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

发布于:2025-02-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

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 的内存池是一种分层的内存管理机制,主要分为小块内存分配和大块内存分配两种模式:

  1. 小块内存分配 :从预先分配的内存块中分配内存,避免频繁调用系统级的 mallocfree
  2. 大块内存分配 :直接调用系统级的 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博客


网站公告

今日签到

点亮在社区的每一天
去签到