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

相关文章:

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;ng…...

如何在 ubuntu 上使用 Clash 与 docker 开启代理拉起

如何在 ubuntu 上使用 Clash https://github.com/doreamon-design/clash/releases上面是clash 的地址 clash_2.0.24_linux_386.tar.gz 下载 386 的 如果你的电脑是inter tar -xzvf clash_2.0.24_linux_386.tar.gz 启动 ./clash 然后会在电脑上生成一个config的文件 /home/xxx/…...

linux tcpdump抓包

参数说明: -i 指定网卡 -w 指定保存文件 -s0 完整抓包 -G 指定间隔时长(秒) -C 指定每个文件大小(M) 用法1: 指定端口输出到指定文件 tcpdump -i em3 -w 182910.pcap 用法2: 指定端口每10分钟输出到不同文件 tcpdump -i em3 -s0 -G 600 -w %Y_%m%d_%H%M_%S.pcap 用法3: 指…...

PLSQL连接Oracle 19c报错ORA-28040

PLSQL连接Oracle 19c报错ORA-28040 原因解析解决办法原因解析 使用PLSQL Developer连接19c数据库报错: ORA-28040: No matching authentication protocol报错信息解析: [oracle@ora19c ~]$ oerr ora 2804028040, 0000, "No matching authentication protocol" /…...

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…...

音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现

一、引言 由《音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流》可以知道,推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP,生成RTP流: ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…...

Nginx 安装及配置教程(Windows)【安装】

文章目录 一、 Nginx 下载 1. 官网下载2. 其它渠道 二、 Nginx 安装三、 配置四、 验证五、 其它问题 1. 常用命令2. 跨域问题 软件 / 环境安装及配置目录 一、 Nginx 下载 1. 官网下载 安装地址:https://nginx.org/en/download.html 打开浏览器输入网址 htt…...

《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战

前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…...

嵌入式0xDEADBEEF

在嵌入式系统中,0xDEADBEEF 是一个常见的“魔数”(magic number),通常用于调试和内存管理。它的含义和用途如下: 1. 调试用途 未初始化内存的标记:在调试时,0xDEADBEEF 常用于标记未初始化或已…...

B+树作为数据库索引结构的优势对比

MySQL作为数据库,它的功能就是做数据存储和数据查找;使用B树作为索引结构是为了实现高效的查找、插入和删除操作。 B树的查找、插入、删除的复杂度都为 O(log n),它是一个多叉树的结构,能兼顾各种操作的效率的数据结构。如果使用…...

自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用

在Oracle Database 12c Release 1 (12.1)版本中,引入了对SQL计划管理(SPM)功能的增强,特别是关于SQL计划基线的自动进化机制。这一改进允许数据库更加智能地管理和优化SQL查询的执行计划,确保即使数据分布发生变化&…...

什么是DeFi (去中心化金融)

DeFi (去中心化金融) 概述 💰 1. DeFi 基础概念 1.1 什么是 DeFi? DeFi 是建立在区块链上的金融服务生态系统,它: 无需中心化中介开放且透明无需许可即可参与代码即法律 1.2 DeFi 的优势 开放性:任何人都可以参与…...

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly

Arxiv日期:2024.2.14机构:Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论:十进制加法任务上的长度泛化最佳组合: FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…...

SpringAI做对了什么

开发|界面|引擎|交付|副驾——重写全栈法则:AI原生的倍速造应用流 你好,这里是nine[谈架构]系列。 欢迎关注评论私信交流~ SpringAI 在 AI 编程领域延续了Spring的诸多优势,从易于集成、到通用…...

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前,多所大学已经陆续给出了分数查分时间,综合往年情况来看,每年的查分时间一般集中在2月底。 等待出成绩的日子,学子们的心情是万分焦急,小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...

C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector

C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector code review! 文章目录 C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector1. `std::copy`1.1.用法1.2.示例2.`std::vector::assign`2.1.用法2.2.示例3.区别总结4.支持assign的容器和不支持ass…...

文件IO(20250217)

1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...

Django5 实用指南(四)URL路由与视图函数

4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一&#xff0c;它负责将用户的 HTTP 请求&#xff08;即 URL&#xff09;映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时&#xff0c;Django 会根据项目的 URL 配置文件&#xff08;urls.py&#…...

Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路

一、资料快车 1、深入了解Android输入系统&#xff1a;https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考&#xff1a; 2、系统程序分析方法 1&#xff09;加入log&#xff0c;并跟着log一步步分析 -logc…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...