当前位置: 首页 > article >正文

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

ngx_create_pool

声明在 src\core\ngx_palloc.h 中

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);

实现在 src\core\ngx_palloc.c 中

ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;

    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;
}

函数签名

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)
  • 功能 :创建一个大小为 size 的内存池,并返回指向该内存池的指针。
  • 参数
    • size:指定内存池的总大小。
    • log:日志对象,用于记录错误信息。
  • 返回值 :成功时返回指向内存池的指针,失败时返回 NULL

定义局部变量
ngx_pool_t *p;
  • 定义一个指针变量 p,用于存储新创建的内存池对象的地址。

分配内存
p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
if (p == NULL) {
    return NULL;
}

调用 ngx_memalign 函数分配一块对齐的内存,大小为 size,对齐方式为 NGX_POOL_ALIGNMENT

如果分配失败(返回 NULL),直接返回 NULL,表示内存池创建失败。


ngx_memalign

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


NGX_POOL_ALIGNMENT

定义在 src\core\ngx_palloc.h

#define NGX_POOL_ALIGNMENT       16

初始化内存池的 d 域 

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;

  • p->d.last:指向当前内存池中可用内存的起始位置,初始值为 p 加上 sizeof(ngx_pool_t),即跳过内存池头部结构体。
  • p->d.end:指向内存池的末尾,初始值为 p + size
  • p->d.next:指向下一个内存池块,默认初始化为 NULL
  • p->d.failed:记录分配失败的次数,初始值为 0

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型-CSDN博客

计算最大分配大小 

size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;

size 减去 sizeof(ngx_pool_t),得到实际可用于分配的内存大小。

p->max 设置为较小值:sizeNGX_MAX_ALLOC_FROM_POOL

p->max 表示从内存池中分配的最大块大小。

如果请求的内存超过 p->max,则会使用大块内存分配机制(见后续的 large 字段)。


 NGX_MAX_ALLOC_FROM_POOL

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


初始化其他字段 

p->current = p;
p->chain = NULL;
p->large = NULL;
p->cleanup = NULL;
p->log = log;
  • p->current:指向当前正在使用的内存池块,初始值为 p
  • p->chain:指向内存池链表,默认初始化为 NULL
  • p->large:指向大块内存分配链表,默认初始化为 NULL
  • p->cleanup:指向清理回调函数链表,默认初始化为 NULL
  • p->log:保存日志对象,用于记录错误信息。
返回内存池指针 
return p;
  • 返回指向新创建的内存池对象的指针。

http://www.kler.cn/a/550515.html

相关文章:

  • 关于Node.js前端面试的试题概念、工作原理及实际应用
  • 【R语言】回归分析与判别分析
  • Spring Boot 启动优化✨
  • 车载音频配置(一)
  • SQL 优化工具使用之 explain 详解
  • C语言实现的常见排序算法
  • AI Agent 技术在网络中有什么应用
  • 虚拟机如何添加硬盘
  • 短视频导演编导制片人编剧教程策划影视媒体电商摄影后期 知识总结
  • DeepSeek-R1:通过强化学习激励大模型的推理能力
  • 涌现之谜:神经网络中的意识幻象与信息熵变
  • DnCNN 介绍及基于Pytorch复现
  • PageHelper分页异常深度解析与解决方案
  • Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常
  • Windchill-PDM-对象介绍
  • deepseek_各个版本django特性
  • ROS1基础学习[记录b站阿杰]
  • Linux 命令行编辑快捷键
  • C语言的区块链
  • 利用SkinMagic美化MFC应用界面