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

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

 ngx_palloc_small

声明在 src\core\ngx_palloc.c

 

static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,
    ngx_uint_t align);

定义在 src\core\ngx_palloc.c

static ngx_inline void *
ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)
{
    u_char      *m;
    ngx_pool_t  *p;

    p = pool->current;

    do {
        m = p->d.last;

        if (align) {
            m = ngx_align_ptr(m, 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);
}

 函数原型与参数说明 

static ngx_inline void *
ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)
  • pool :指向当前内存池的指针。
  • size :需要分配的内存大小。
  • align :是否需要进行内存对齐。如果为非零值,则会对分配的内存地址进行对齐。

返回值是一个指向分配内存的指针,或者在分配失败时返回 NULL

初始化局部变量

u_char      *m;
ngx_pool_t  *p;

 

  • m 是一个指针,用于记录当前尝试分配的内存地址。
  • p 是一个指向内存池块的指针,用于遍历内存池链表。
获取当前内存池块
p = pool->current;
  • pool->current 是内存池中当前正在使用的块。
  • 这里将 p 初始化为当前块,表示从当前块开始尝试分配内存
开始循环遍历内存池块
do {
    ...
} while (p);
  • 使用 do-while 循环遍历内存池的所有块。
  • 如果当前块无法满足分配需求,则尝试下一个块
获取当前块的剩余空间起始地址
m = p->d.last;
  • p->d.last 是当前块中已分配内存的末尾地址。
  • m 设置为该地址,表示从这里开始尝试分配新的内存

检查是否需要对齐

if (align) {
    m = ngx_align_ptr(m, NGX_ALIGNMENT);
}

 

  • 如果 align 参数为非零值,则调用 ngx_align_ptrm 进行对齐。
  • NGX_ALIGNMENT 是 Nginx 中定义的对齐常量,为 16 字节。

ngx_align_ptr

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_align_ptr -CSDN博客

检查剩余空间是否足够

if ((size_t) (p->d.end - m) >= size) {
    p->d.last = m + size;
    return m;
}
  • p->d.end 是当前块的结束地址。
  • (p->d.end - m) 表示当前块的剩余可用空间大小。
  • 如果剩余空间大于等于请求的 size,则:
    • 更新 p->d.last,将其移动到新分配内存的末尾。
    • 返回分配的内存地址 m

尝试下一个内存块 

p = p->d.next;

  

  • 如果当前块无法满足分配需求,则通过 p->d.next 移动到下一个内存块。
  • 继续循环,直到找到合适的块或遍历完所有块。
分配新的内存块
return ngx_palloc_block(pool, size);
  • 如果遍历完所有现有块仍然无法满足分配需求,则调用 ngx_palloc_block 函数创建一个新的内存块。
  • ngx_palloc_block 会分配一块更大的内存,并将其链接到内存池链表中。

ngx_palloc_block

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


 


网站公告

今日签到

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