Ubuntu 下 nginx-1.24.0 源码分析 - ngx_create_pool函数

embedded/2025/2/19 2:30:10/

ngx_create_pool

声明在 src\core\ngx_palloc.h 中

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);

实现在 src\core\ngx_palloc.c 中

ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{ngx_pool_t  *p;p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);if (p == NULL) {return NULL;}p->d.last = (u_char *) p + sizeof(ngx_pool_t);p->d.end = (u_char *) p + size;p->d.next = NULL;p->d.failed = 0;size = size - sizeof(ngx_pool_t);p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;p->current = p;p->chain = NULL;p->large = NULL;p->cleanup = NULL;p->log = log;return p;
}

函数签名

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)
  • 功能 :创建一个大小为 size 的内存池,并返回指向该内存池的指针。
  • 参数
    • size:指定内存池的总大小。
    • log:日志对象,用于记录错误信息。
  • 返回值 :成功时返回指向内存池的指针,失败时返回 NULL

定义局部变量
ngx_pool_t *p;
  • 定义一个指针变量 p,用于存储新创建的内存池对象的地址。

分配内存
p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
if (p == NULL) {return NULL;
}

调用 ngx_memalign 函数分配一块对齐的内存,大小为 size,对齐方式为 NGX_POOL_ALIGNMENT

如果分配失败(返回 NULL),直接返回 NULL,表示内存池创建失败。


ngx_memalign

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_memalign函数-CSDN博客


NGX_POOL_ALIGNMENT

定义在 src\core\ngx_palloc.h

#define NGX_POOL_ALIGNMENT       16

初始化内存池的 d 域 

p->d.last = (u_char *) p + sizeof(ngx_pool_t);
p->d.end = (u_char *) p + size;
p->d.next = NULL;
p->d.failed = 0;

  • p->d.last:指向当前内存池中可用内存的起始位置,初始值为 p 加上 sizeof(ngx_pool_t),即跳过内存池头部结构体。
  • p->d.end:指向内存池的末尾,初始值为 p + size
  • p->d.next:指向下一个内存池块,默认初始化为 NULL
  • p->d.failed:记录分配失败的次数,初始值为 0

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型-CSDN博客

计算最大分配大小 

size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;

size 减去 sizeof(ngx_pool_t),得到实际可用于分配的内存大小。

p->max 设置为较小值:sizeNGX_MAX_ALLOC_FROM_POOL

p->max 表示从内存池中分配的最大块大小。

如果请求的内存超过 p->max,则会使用大块内存分配机制(见后续的 large 字段)。


 NGX_MAX_ALLOC_FROM_POOL

Ubuntu 下 nginx-1.24.0 源码分析 - NGX_MAX_ALLOC_FROM_POOL-CSDN博客


初始化其他字段 

p->current = p;
p->chain = NULL;
p->large = NULL;
p->cleanup = NULL;
p->log = log;
  • p->current:指向当前正在使用的内存池块,初始值为 p
  • p->chain:指向内存池链表,默认初始化为 NULL
  • p->large:指向大块内存分配链表,默认初始化为 NULL
  • p->cleanup:指向清理回调函数链表,默认初始化为 NULL
  • p->log:保存日志对象,用于记录错误信息。
返回内存池指针 
return p;
  • 返回指向新创建的内存池对象的指针。

http://www.ppmy.cn/embedded/163385.html

相关文章

采用分布式部署deepseek

分布式部署DeepSeek涉及使用多个计算节点来加速模型训练或提升推理效率。下面是一个基本的指南&#xff0c;帮助您了解如何进行分布式部署。 1. 环境准备 硬件需求&#xff1a;确保您的集群环境中有足够的GPU资源&#xff0c;并且所有机器之间可以通过高速网络互联。软件依赖…

Leetcode Hot100 第30题 416.分割等和子集

class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int num:nums){sumnum;}if(sum%21) return false;int bag_size sum/2;// return dfs(nums,nums.size()-1,bag_size);//递归做法vector<vector<bool>> dp(nums.size()1,vec…

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现&#xff1a; 一、背景   UWB&#xff08;Ultra-Wideband&#xff09;技术也被称之为“超宽带”&#xff0c;又称之为脉冲无线电技术。这是一种无需任何载波&#xff0c;通过发送纳秒…

假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?

前言&#xff1a;本篇文章解释了接口学习过程中的2个常见问题&#xff0c;一个是“为什么是类在使用接口”&#xff0c;另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”&#xff0c;旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…

MATLAB图像处理:Sobel、Roberts、Canny等边缘检测算子

边缘是图像中像素值剧烈变化的区域&#xff0c;反映了目标的轮廓、纹理等关键信息。边缘检测是图像分割、目标识别等任务的基础。本文将系统解析 六种经典边缘检测算子 的数学原理、实现方法及适用场景&#xff0c;并给出完整的MATLAB代码示例和对比分析。 1. 边缘检测基础 1…

【第2章:神经网络基础与实现——2.1 前馈神经网络的结构与工作原理】

老铁们好!今天我们要来一场长达两万字的超详细技术探险,我会像拆解乐高积木一样把前馈神经网络(Feedforward Neural Network)的每个零件摆在台面上,用最接地气的方式让你彻底搞懂这个深度学习基石的工作原理。准备好了吗?我们开始吧! 第一章:神经网络的 “乐高积木” 1…

什么是SpringMVC

SpringMVC的解释 SpringMVC&#xff08;Spring Model-View-Controller&#xff09;是Spring框架的一部分&#xff0c;是一个基于Java的轻量级的Web框架&#xff0c;用于构建Web应用程序。它遵循MVC设计模式&#xff0c;将数据&#xff08;Model&#xff09;、视图&#xff08;…

Unity-Mirror网络框架-从入门到精通之PlayerTest示例

文章目录 前言示例介绍PlayerReliable,PlayerUnreliable,PlayerHybrid区别PlayerControllerRB和PlayerController区别最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主…