当前位置: 首页 > 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| NULLlarge1 --> 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]

http://www.lryc.cn/news/540500.html

相关文章:

  • 如何在 ubuntu 上使用 Clash 与 docker 开启代理拉起
  • linux tcpdump抓包
  • PLSQL连接Oracle 19c报错ORA-28040
  • 汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
  • 音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现
  • Nginx 安装及配置教程(Windows)【安装】
  • 《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战
  • 嵌入式0xDEADBEEF
  • B+树作为数据库索引结构的优势对比
  • 自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
  • 什么是DeFi (去中心化金融)
  • 计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)
  • LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly
  • SpringAI做对了什么
  • DeepSeek预测25考研分数线
  • C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector
  • 文件IO(20250217)
  • Django5 实用指南(四)URL路由与视图函数
  • Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路
  • Java中Map循环安全的删除数据的4中方法
  • 蓝桥杯(B组)-每日一题(1093字符逆序)
  • 【数据分析】3 数据分析成长之路
  • 循环神经网络RNN原理与优化
  • Python正则表达式处理中日韩字符过滤全解析
  • Zabbix 7.2实操指南:基于OpenEuler系统安装Zabbix 7.2
  • 扩展阅读-Elasticsearch 通过索引阻塞实现数据保护深入解析
  • SpringMVC重定向接口,参数暴露在url中解决方案!RedirectAttributes
  • 硬件学习笔记--46 电能表影响量试验梳理
  • 大数据技术之HBase操作归纳
  • 后端Java Stream数据流的使用=>代替for循环