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

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

ngx_pool_t

定义在 src/core/ngx_core.h

typedef struct ngx_pool_s            ngx_pool_t;

ngx_pool_s

定义在 src/core/ngx_palloc.h

struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;
    ngx_pool_t           *current;
    ngx_chain_t          *chain;
    ngx_pool_large_t     *large;
    ngx_pool_cleanup_t   *cleanup;
    ngx_log_t            *log;
};

ngx_pool_s 的主要作用是实现一个内存池(memory pool) ,为 Nginx 提供高效、低开销的内存分配和释放机制。它的设计目标包括:

  • 减少频繁调用系统级的内存分配函数(如 mallocfree),从而提高性能。
  • 简化内存释放:当内存池不再使用时,只需一次性释放整个内存池,而不需要逐个释放每个小块内存。
  • 支持大块内存分配(通过 large 字段)和清理回调(通过 cleanup 字段)。

struct ngx_pool_s {
    ngx_pool_data_t       d;         // 当前内存池的数据块信息
    size_t                max;       // 小块内存的最大分配大小
    ngx_pool_t           *current;  // 指向当前内存池链表中的某个节点
    ngx_chain_t          *chain;    // 链表,用于管理缓冲区链
    ngx_pool_large_t     *large;    // 大块内存分配链表
    ngx_pool_cleanup_t   *cleanup;  // 清理回调链表
    ngx_log_t            *log;      // 日志对象,用于记录错误信息
};

ngx_pool_data_t

在 src\core\ngx_palloc.h

typedef struct {
    u_char               *last;
    u_char               *end;
    ngx_pool_t           *next;
    ngx_uint_t            failed;
} ngx_pool_data_t;
  • last: 指向当前内存块中未分配内存的起始位置。每次分配内存时,从 last 开始分配,并更新 last
  • end: 指向当前内存块的末尾位置。如果 last 超过 end,表示当前内存块已满,需要分配新的内存块。
  • next: 指向下一个内存块。Nginx 的内存池是由多个内存块组成的链表。
  • failed: 记录分配失败的次数。如果某个内存块的分配失败次数过多,Nginx 会跳过该内存块,直接尝试分配新的内存块。

ngx_pool_large_t 

定义在  src\core\ngx_palloc.h

typedef struct ngx_pool_large_s  ngx_pool_large_t;

struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};
  1. next

    • 类型:ngx_pool_large_t *
    • 含义:指向下一个 ngx_pool_large_s 节点的指针。
    • 作用:ngx_pool_large_s 使用单向链表的形式组织所有分配的大块内存。通过 next 指针,可以遍历整个链表,方便管理和释放这些大块内存。
  2. alloc

    • 类型:void *
    • 含义:指向实际分配的大块内存的指针。
    • 作用:alloc 存储了通过系统调用(如 malloc)分配的大块内存的地址。Nginx 在需要释放内存池时,可以通过遍历链表并逐个释放这些大块内存。

大块内存分配流程

当请求的内存超过阈值时:

  1. 调用 ngx_alloc 从系统分配所需内存。
  2. 创建 ngx_pool_large_s 节点,alloc 指向新分配的内存。
  3. 将新节点插入链表

内存池结构关系


    pool[ngx_pool_t] -->|large| large1[ngx_pool_large_t]
    large1 -->|next| large2[ngx_pool_large_t]
    large2 -->|next| large3[ngx_pool_large_t]
    large3 -->|next| NULL
    
    large1 --> alloc1[Alloc Memory]
    large2 --> alloc2[Alloc Memory]
    large3 --> alloc3[Alloc Memory]

内存池 (ngx_pool_t)
│
├── ... 其他成员 ...
│
└── large → [large_node1] → [large_node2] → ... → NULL
        │             │              │
        alloc         alloc          alloc
        ↓             ↓              ↓
        [Memory1]     [Memory2]      [Memory3]

相关文章:

  • C++笔记之标准库中用于处理迭代器的`std::advance`和`std::distance`
  • Rust中的collections
  • DeepSeek在学术读写翻译中的独特优势
  • Spring容器扩展点
  • 无线网络数字孪生(Digital Twin for Wireless Networks)
  • Node.js中不支持require和import两种导入模块的混用
  • 进阶——第十六届蓝桥杯嵌入式熟练度练习(eeprom的读写)
  • 【Unity精品插件】NGUI:UI设计传奇工具
  • 动态规划 之 划分型DP
  • 【Java】泛型与集合篇(四)
  • 简易的仿桌面文件夹上传(vue2)
  • AI进展不止于基准:深度解析Grok 3的局限
  • 为AI聊天工具添加一个知识系统 之109 详细设计之50 三性三量三境
  • 数据分析--数据清洗
  • C++ 设计模式-外观模式
  • openharmony中HDF驱动框架关键流程说明-观察者模式
  • Redis7——基础篇(四)
  • 安卓鸿蒙应用开发架构变迁
  • HTML之JavaScript Form表单事件
  • [生活杂项][运动教程]自由泳
  • 中美经贸高层会谈在瑞士日内瓦开始举行
  • 央行:中国政府债务扩张仍有可持续性
  • 远离军事前线的另一面暗斗:除了“断水”,印度还试图牵制对巴国际援助
  • 比特币价格时隔三个月再度站上10万美元
  • 中华人民共和国和俄罗斯联邦关于进一步加强合作维护国际法权威的联合声明
  • 欧盟委员会计划对950亿欧元美国进口产品采取反制措施