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

ops/2025/3/4 2:53:04/

详解(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/ops/162933.html

相关文章

一文掌握模拟登录的基本原理和实战

文章目录 1. 模拟登录的基本原理1.1 登录流程1.2 关键技术2. 模拟登录的实战步骤2.1 分析登录页面2.2 使用 Requests 实现模拟登录2.3 处理验证码2.4 使用 Selenium 实现模拟登录3. 实战案例:模拟登录豆瓣3.1 分析豆瓣登录页面3.2 实现代码4. 注意事项5. 总结模拟登录是爬虫开…

Flutter - 布局Widget

Flutter的布局主要分为 单子组件 和 多子组件 两大类: Container、Padding、Align这些属于单子组件,而Row、Column、ListView这些则是多子组件。 单子组件 Align组件 Align 是一个用于控制子组件位置的单子布局组件。它通过指定对齐方式&#xff08…

DeepSeek与人工智能的结合:探索搜索技术的未来

云边有个稻草人-CSDN博客 目录 引言 一、DeepSeek的技术背景 1.1 传统搜索引擎的局限性 1.2 深度学习在搜索中的优势 二、DeepSeek与人工智能的结合 2.1 自然语言处理(NLP) 示例代码:基于BERT的语义搜索 2.2 多模态搜索 示例代码&…

Qt显示一个hello world

一、显示思路 思路一:通过图形化方式,界面上创建出一个控件显示。 思路二:通过编写C代码在界面上创建控件显示。 二、思路一实现 点开 Froms 的 widget.ui,拖拽 label 控件,显示 hello world 即可。 qmake 基于 .…

BUG日志:使用热点或免费加速器时git链接github出现端口22拒绝访问的解决方法

问题描述 现象:git 连接 GitHub 时,报错 Connection refused on port 22。触发条件: 使用移动热点或免费加速器时必现。使用正常 Wi-Fi 时不出现。 解决步骤 临时切换为 HTTPS 协议(绕过 22 端口): git r…

【深度学习】—— 深入 Keras:从基础到实战的深度学习指南 第1~4章 共12章

《深入 Keras:从基础到实战的深度学习指南》 文章目录 《深入 Keras:从基础到实战的深度学习指南》第1章:Keras简介1.1 Keras的诞生与发展1.1.1 Keras出现的背景与深度学习发展需求1.1.2 版本迭代历程与重大更新 1.2 Keras的设计理念与特点1.…

【前端框架】vue2和vue3的区别详细介绍

Vue 3 作为 Vue 2 的迭代版本,在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别: 响应式系统 Vue 2 实现原理:基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时,Vue 会遍历…

【GB28181】 SIP信令服务器

概述 本文仅总结关于GB28181下的注册、心跳维持等与推流拉流相配合的SIP信令,主要基于eXosip库实现;其中搭建信令服务器参考了开源代码以及B站up北小菜,文章结尾有链接 主要逻辑梳理 配置自身SIP服务器,同时配置自己想要访问的SI…