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

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;
  • 返回指向新创建的内存池对象的指针。

相关文章:

  • 《第三代大语言模型Grok 3:闪亮登场》
  • OpenCV(1):简介、安装、入门案例、基础模块
  • Qt 中使用 SQLite 数据库的完整指南
  • DeepSeek 的创新融合:多行业应用实践探索
  • 网络安全攻防演练——RT实战技巧篇
  • ELK 日志收集框架搭建
  • 【博客之星】GIS老矣尚能饭否?WebGIS项目实战经验与成果展示
  • Oracle视图(基本使用)
  • qt实习总结
  • 内网下,Ubuntu (24.10) 离线安装docker最新版教程
  • 【踩坑实录】-Boundary Amount must be a positive integer, provided amount is: 0
  • 第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025)
  • Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)
  • VINS-mono代码笔记
  • Java 运行时常量池笔记(详细版
  • 第150场双周赛:好数字之和、分割正方形 Ⅰ、分割正方形 Ⅱ、最短匹配字符串
  • 第1章大型互联网公司的基础架构——1.2 客户端连接机房的技术1:DNS
  • Java基于 SpringBoot+Vue的微信小程序跑腿平台V2.0(附源码,文档)
  • css里flex+margin布局
  • iOS 中使用 FFmpeg 进行音视频处理
  • 国家主席习近平任免驻外大使
  • 铜川耀州窑遗址内违法矿场存在多年,省市区文物部门多次处罚叫停仍在生产
  • 中科院合肥物质院迎来新一届领导班子:刘建国继续担任院长
  • 国际博物馆日|航海博物馆:穿梭于海洋神话与造船工艺间
  • 全中国最好的十个博物馆展陈选出来了!
  • 推开“房间”的门:一部“生命存在的舞台” 史