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

阶跃 StepAudio 2.5 ASR 上线!500TPS 极速推理,30分钟语音“秒级转写”

语音 Agent 首字响应慢&#xff0c;很多人以为是 LLM 的锅。其实真正的延时瓶颈常在 ASR&#xff08;自动语音识别&#xff09;&#xff1a;传统的逐 token 串行输出——一段 5 分钟音频&#xff0c;要等几十秒才能拿到完整转写结果&#xff0c;整条链路卡在这一步。 StepAudi…...

KrkrzExtract完整指南:新一代krkrz游戏资源解包工具

KrkrzExtract完整指南&#xff1a;新一代krkrz游戏资源解包工具 【免费下载链接】KrkrzExtract The next generation of KrkrExtract 项目地址: https://gitcode.com/gh_mirrors/kr/KrkrzExtract KrkrzExtract是专门为krkrz游戏引擎设计的下一代资源处理工具&#xff0c…...

TensorRT模型部署提速:除了trtexec,Windows下还有哪些转换ONNX到engine的实用方法?

TensorRT模型部署提速&#xff1a;Windows下ONNX到engine的5种高效转换方案 在工业级AI部署中&#xff0c;模型推理速度直接影响用户体验和系统成本。TensorRT作为NVIDIA推出的高性能推理优化器&#xff0c;能将ONNX模型转换为高度优化的engine文件&#xff0c;实现数倍的推理加…...

【YOLOv5改进实战】BiFPN加权融合:从理论到代码,实现目标检测精度飞跃

1. BiFPN为什么能成为目标检测的"涨点神器"&#xff1f; 第一次接触BiFPN是在处理工业质检项目时遇到的痛点——小目标漏检率居高不下。当时试过各种数据增强和调参手段&#xff0c;效果都不理想&#xff0c;直到尝试用BiFPN替换原生的PANet&#xff0c;mAP直接提升了…...

Qwen3.5-4B-AWQ一文详解:AWQ量化原理+Qwen3.5架构适配技术解析

Qwen3.5-4B-AWQ一文详解&#xff1a;AWQ量化原理Qwen3.5架构适配技术解析 1. 模型概述 Qwen3.5-4B-AWQ-4bit是阿里云通义千问团队推出的轻量化大语言模型&#xff0c;基于Qwen3.5 4B稠密模型通过AWQ量化技术实现4bit压缩。该模型在保持高性能的同时大幅降低资源需求&#xff…...

构建智能安全运维体系,谷歌上线 Agent 及全链路治理能力

Google Cloud Next 26 重磅发布&#xff1a;AI Agent 驱动的全新安全范式 在 Google Cloud Next 26 大会上&#xff0c;谷歌有限责任公司今日发布了一系列全面的安全更新&#xff0c;涵盖 Google 安全运维平台新增的三款 AI Agent&#xff0c;以及将 Wiz 公司的防护范围扩展至竞…...

嵌入式C结构体对齐×大模型权重布局(内存带宽利用率提升3.8倍的底层对齐秘钥)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;嵌入式C结构体对齐大模型权重布局&#xff08;内存带宽利用率提升3.8倍的底层对齐秘钥&#xff09; 在资源受限的嵌入式AI推理场景中&#xff0c;结构体字段对齐不仅关乎内存安全&#xff0c;更直接决定…...

从‘炼丹’到‘精调’:手把手教你用Hugging Face Transformers库正确提取BERT语义向量

从‘炼丹’到‘精调’&#xff1a;手把手教你用Hugging Face Transformers库正确提取BERT语义向量 如果你正在用BERT处理文本却总觉得效果差强人意&#xff0c;很可能问题出在向量提取环节。许多工程师能跑通流程却忽略了关键细节——就像用高级单反相机却始终开着自动模式。本…...

USRP硬件驱动(UHD):软件定义无线电的终极开源解决方案

USRP硬件驱动&#xff08;UHD&#xff09;&#xff1a;软件定义无线电的终极开源解决方案 【免费下载链接】uhd The USRP™ Hardware Driver Repository 项目地址: https://gitcode.com/gh_mirrors/uh/uhd 想象一下&#xff0c;你手中有一台能够接收和发射从50MHz到6GHz…...

别再只用AVPlayer.play()了!盘点AV Foundation播放控制那些容易被忽略的‘坑’与最佳实践

AV Foundation播放控制进阶指南&#xff1a;避开那些让你夜不能寐的"坑" 如果你已经能熟练调用AVPlayer.play()实现基础播放功能&#xff0c;却在构建企业级播放器时频繁遭遇进度跳转卡顿、内存暴涨或状态同步紊乱等问题&#xff0c;这篇文章正是为你准备的。我们将深…...