Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(3)

news/2025/3/1 0:00:51/

详解(3)


初始化路径数组(paths

   n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;if (ngx_array_init(&cycle->paths, pool, n, sizeof(ngx_path_t *))!= NGX_OK){ngx_destroy_pool(pool);return NULL;}ngx_memzero(cycle->paths.elts, n * sizeof(ngx_path_t *));

n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;

确定 paths 数组的初始容量 n。若旧周期(old_cycle)存在路径配置,则继承其大小;否则预分配 10 个元素。

paths 用于存储 Nginx 运行时路径(如临时文件目录)。旧周期可能已包含路径信息(如 client_body_temp_path),新周期需复用或初始化。

资源复用:继承旧周期的容量,避免重复计算路径数量。
预分配优化:默认值 10 是经验值,平衡内存占用与扩容开销。


if (ngx_array_init(&cycle->paths, pool, n, sizeof(ngx_path_t *)) != NGX_OK)

初始化 cycle->paths 数组,分配内存池 pool 中的内存,容量 n,每个元素为 ngx_path_t* 类型。

ngx_array_t 是 Nginx 动态数组结构,支持自动扩容。此处存储指向路径对象(ngx_path_t)的指针。

若初始化失败,立即销毁内存池(ngx_destroy_pool),确保资源一致性。


ngx_memzero(cycle->paths.elts, n * sizeof(ngx_path_t *));

paths 数组的前 n 个元素清零(初始化为 NULL)。

ngx_array_init 分配的内存未初始化,可能包含脏数据。路径指针需显式置空,避免后续误判。

确保数组初始状态明确(所有元素为 NULL)。


总结

代码行逻辑目标设计思想
n = ...确定初始容量继承旧配置或预分配,平衡性能与内存。
ngx_array_init初始化动态数组内存池管理 + 自动扩容,支持灵活扩展。
ngx_memzero初始化内存避免脏数据,确保指针安全。

关键数据结构
  • ngx_array_t
    typedef struct {void        *elts;    // 元素数组指针ngx_uint_t   nelts;   // 当前元素数量size_t       size;    // 单个元素大小ngx_uint_t   nalloc;  // 数组容量ngx_pool_t  *pool;    // 内存池
    } ngx_array_t;
    
    • 动态扩容:当元素数量超过 nalloc 时,自动按 2 倍容量扩展。

http://www.ppmy.cn/news/1575626.html

相关文章

在CentOS 7上添加Swap交换空间完整指南

在CentOS 7上添加Swap交换空间完整指南 前言:为何需要Swap空间? 当服务器内存资源告急时,Swap空间能有效防止应用崩溃或数据丢失。这个位于硬盘上的特殊区域可作为内存的应急缓冲区,虽然读写速度不及物理内存,但能避…

登录-10.Filter-登录校验过滤器

一.登录校验过滤器的实现思路 我们要实现登录校验过滤器,就要首先明白登录校验过滤器的实现思路。登录校验过滤器是用来实现登录校验的。那么首先思考第一个问题,所有的请求都需要校验吗? 答案是否定的,因为login请求就不需要过滤…

CSP-S 2022 T1假期计划

CSP-S 2022 T1假期计划 先思考暴力做法,题目需要找到四个不相同的景点,那我们就枚举这四个景点,判断它们之间的距离是否符合条件,条件是任意两个点之间的距离是否大于 k k k,所以我们需要求出任意两点之间的距离。常用…

【Java项目】基于Spring Boot的旅游管理系统

【Java项目】基于Spring Boot的旅游管理系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:旅游管理系统是一个基于Web的在线平台,主要分为前台和后台两大功能模块。前台功能模块包括(1)首…

Redis-列表结构实操

列表实操 前言简单练习基本的LPUSH和RPUSH操作列表元素的访问与修改列表元素的插入和删除列表阻塞操作 困难练习分页列表游标机制业务上考虑直接访问任意页如何高效分页局限性小结 实现限时排行版轮换消息队列可靠性实现分布式锁实现 总结 前言 之前总结过-列表的数据结构,但是…

go 查看版本

个人学习笔记 1. 打开终端(或命令提示符) 在 Windows 上,使用 cmd 或 PowerShell。在 macOS 或 Linux 上,使用终端应用程序。 2. 运行以下命令 go version 3. 查看输出 命令执行后,终端会显示已安装的 Go 版本&…

JAVA【微服务】Spring AI 使用详解

目录 一、前言二、Spring AI 概述2.1 什么是 Spring AI2.2 Spring AI 特点2.3 Spring AI 带来的便利2.4 Spring AI 应用领域2.4.1 聊天模型2.4.2 文本到图像模型2.4.3 音频转文本2.4.4 嵌入大模型使用2.4.5 矢量数据库支持2.4.6 数据工程 ETL 框架三、Spring AI 对接 ChatGPT3.…

设计模式-(装饰器,适配器,观察者,外观)

装饰器模式 概念: 它允许在不改变对象自身的情况下,动态地给对象添加额外的功能。通过使用装饰器模式,可以在运行时对对象进行扩展,而不需要创建大量的子类 应用: 当你希望在不修改原有类的情况下,给对…