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 提供高效、低开销的内存分配和释放机制。它的设计目标包括:
- 减少频繁调用系统级的内存分配函数(如
malloc和free),从而提高性能。- 简化内存释放:当内存池不再使用时,只需一次性释放整个内存池,而不需要逐个释放每个小块内存。
- 支持大块内存分配(通过
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.htypedef 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; };
next
- 类型:
ngx_pool_large_t *- 含义:指向下一个
ngx_pool_large_s节点的指针。- 作用:
ngx_pool_large_s使用单向链表的形式组织所有分配的大块内存。通过next指针,可以遍历整个链表,方便管理和释放这些大块内存。
alloc
- 类型:
void *- 含义:指向实际分配的大块内存的指针。
- 作用:
alloc存储了通过系统调用(如malloc)分配的大块内存的地址。Nginx 在需要释放内存池时,可以通过遍历链表并逐个释放这些大块内存。
大块内存分配流程
当请求的内存超过阈值时:
- 调用
ngx_alloc从系统分配所需内存。- 创建
ngx_pool_large_s节点,alloc指向新分配的内存。- 将新节点插入链表
内存池结构关系
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 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py&#…...
Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路
一、资料快车 1、深入了解Android输入系统:https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考: 2、系统程序分析方法 1)加入log,并跟着log一步步分析 -logc…...
阶跃 StepAudio 2.5 ASR 上线!500TPS 极速推理,30分钟语音“秒级转写”
语音 Agent 首字响应慢,很多人以为是 LLM 的锅。其实真正的延时瓶颈常在 ASR(自动语音识别):传统的逐 token 串行输出——一段 5 分钟音频,要等几十秒才能拿到完整转写结果,整条链路卡在这一步。 StepAudi…...
KrkrzExtract完整指南:新一代krkrz游戏资源解包工具
KrkrzExtract完整指南:新一代krkrz游戏资源解包工具 【免费下载链接】KrkrzExtract The next generation of KrkrExtract 项目地址: https://gitcode.com/gh_mirrors/kr/KrkrzExtract KrkrzExtract是专门为krkrz游戏引擎设计的下一代资源处理工具,…...
TensorRT模型部署提速:除了trtexec,Windows下还有哪些转换ONNX到engine的实用方法?
TensorRT模型部署提速:Windows下ONNX到engine的5种高效转换方案 在工业级AI部署中,模型推理速度直接影响用户体验和系统成本。TensorRT作为NVIDIA推出的高性能推理优化器,能将ONNX模型转换为高度优化的engine文件,实现数倍的推理加…...
【YOLOv5改进实战】BiFPN加权融合:从理论到代码,实现目标检测精度飞跃
1. BiFPN为什么能成为目标检测的"涨点神器"? 第一次接触BiFPN是在处理工业质检项目时遇到的痛点——小目标漏检率居高不下。当时试过各种数据增强和调参手段,效果都不理想,直到尝试用BiFPN替换原生的PANet,mAP直接提升了…...
Qwen3.5-4B-AWQ一文详解:AWQ量化原理+Qwen3.5架构适配技术解析
Qwen3.5-4B-AWQ一文详解:AWQ量化原理Qwen3.5架构适配技术解析 1. 模型概述 Qwen3.5-4B-AWQ-4bit是阿里云通义千问团队推出的轻量化大语言模型,基于Qwen3.5 4B稠密模型通过AWQ量化技术实现4bit压缩。该模型在保持高性能的同时大幅降低资源需求ÿ…...
构建智能安全运维体系,谷歌上线 Agent 及全链路治理能力
Google Cloud Next 26 重磅发布:AI Agent 驱动的全新安全范式 在 Google Cloud Next 26 大会上,谷歌有限责任公司今日发布了一系列全面的安全更新,涵盖 Google 安全运维平台新增的三款 AI Agent,以及将 Wiz 公司的防护范围扩展至竞…...
嵌入式C结构体对齐×大模型权重布局(内存带宽利用率提升3.8倍的底层对齐秘钥)
更多请点击: https://intelliparadigm.com 第一章:嵌入式C结构体对齐大模型权重布局(内存带宽利用率提升3.8倍的底层对齐秘钥) 在资源受限的嵌入式AI推理场景中,结构体字段对齐不仅关乎内存安全,更直接决定…...
从‘炼丹’到‘精调’:手把手教你用Hugging Face Transformers库正确提取BERT语义向量
从‘炼丹’到‘精调’:手把手教你用Hugging Face Transformers库正确提取BERT语义向量 如果你正在用BERT处理文本却总觉得效果差强人意,很可能问题出在向量提取环节。许多工程师能跑通流程却忽略了关键细节——就像用高级单反相机却始终开着自动模式。本…...
USRP硬件驱动(UHD):软件定义无线电的终极开源解决方案
USRP硬件驱动(UHD):软件定义无线电的终极开源解决方案 【免费下载链接】uhd The USRP™ Hardware Driver Repository 项目地址: https://gitcode.com/gh_mirrors/uh/uhd 想象一下,你手中有一台能够接收和发射从50MHz到6GHz…...
别再只用AVPlayer.play()了!盘点AV Foundation播放控制那些容易被忽略的‘坑’与最佳实践
AV Foundation播放控制进阶指南:避开那些让你夜不能寐的"坑" 如果你已经能熟练调用AVPlayer.play()实现基础播放功能,却在构建企业级播放器时频繁遭遇进度跳转卡顿、内存暴涨或状态同步紊乱等问题,这篇文章正是为你准备的。我们将深…...
