当前位置: 首页 > article >正文

Nginx内存池源代码剖析----ngx_create_pool函数

ngx_create_pool 是 Nginx 内存池 的初始化函数,负责创建并初始化一个内存池对象。它的作用是 为后续的内存分配操作提供统一的管理入口,通过预分配一块较大的内存区域,并基于此区域实现高效的内存分配、对齐管理和资源回收。

源代码定义:

ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)  // 根据size大小开辟内存池
{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_data_t 结构体

last:指向当前内存池中可用内存的起始地址。
end:指向当前内存池的末尾位置。
next:指向下一个内存池块,用于链接多个内存池。
failed:记录当前内存池分配失败的次数。当失败次数超过一定阈值时,Nginx 会跳过该内存池,直接尝试从下一个内存池分配内存。

ngx_pool_s 结构体

d:内存池的核心数据块,包含可用内存的起始地址、末尾位置、下一个内存池块等信息。
max:当前内存池可分配的最大内存大小。如果请求的内存大小超过 max,则从大内存块链表(large)中分配。
current:指向当前可用的内存池。当当前内存池的空间不足时,Nginx 会尝试从 current 指向的下一个内存池分配内存。
chain:用于链表管理,通常与 Nginx 的缓冲区(ngx_buf_t)相关。
large:指向大内存块链表。当请求的内存大小超过 max 时,Nginx 会从大内存块链表中分配内存。
cleanup:清理回调函数链表。当内存池销毁时,Nginx 会调用这些回调函数来释放资源。
log:日志对象,用于记录内存池的相关日志信息。

在这里插入图片描述
ngx_create_pool函数执行流程:
在这里插入图片描述

使用 ngx_memalign 函数分配一块对齐的内存。NGX_POOL_ALIGNMENT 是内存对齐的边界(通常是
16 字节)。 如果分配失败,返回 NULL。

在这里插入图片描述

last 指向内存池中可用内存的起始地址,跳过 ngx_pool_t 结构体本身。
end 指向内存池的末尾位置。
next 初始化为 NULL,表示当前没有下一个内存池块。
failed 初始化为 0,表示当前内存池尚未发生分配失败。

在这里插入图片描述

计算内存池中实际可用的内存大小(减去 ngx_pool_t 结构体本身的大小)。
max 表示当前内存池可分配的最大内存大小。如果可用内存大小小于 NGX_MAX_ALLOC_FROM_POOL(通常是 4KB),则使用可用内存大小;否则使用 NGX_MAX_ALLOC_FROM_POOL。

ngx_create_pool 函数的作用是:

  1. 分配一块对齐的内存,并初始化内存池的核心数据结构。
  2. 管理可用内存的起始地址和末尾位置,确保内存分配的高效性。
  3. 支持大内存块和小内存块的分离,减少内存碎片。
  4. 提供日志和清理机制,方便调试和资源管理。
    通过这种设计,Nginx 的内存池能够高效地管理内存分配和释放,减少内存碎片,并提高性能。

相关文章:

Nginx内存池源代码剖析----ngx_create_pool函数

ngx_create_pool 是 Nginx 内存池 的初始化函数&#xff0c;负责创建并初始化一个内存池对象。它的作用是 为后续的内存分配操作提供统一的管理入口&#xff0c;通过预分配一块较大的内存区域&#xff0c;并基于此区域实现高效的内存分配、对齐管理和资源回收。 源代码定义&…...

DeepSeek 开放平台无法充值 改用其他平台API调用DeepSeek-chat模型方法

近几天DeepSeek开放平台无法充值目前已经关闭状态&#xff0c;大家都是忙着接入DeepSeek模型 &#xff0c;很多人想使用DeepSeek怎么办&#xff1f; 当然还有改用其他平台API调用方法&#xff0c;本文以本站的提供chatgpt系统为例&#xff0c;如何修改DeepSeek-chat模型API接口…...

QT基础一、学会建一个项目

注&#xff1a;因为CSDN有很多付费才能吃到的史&#xff0c;本人对此深恶痛绝&#xff0c;所以我打算出一期免费的QT基础入门专栏&#xff0c;这是QT基础知识的第一期&#xff0c;学会建一个项目&#xff0c;本专栏是适用于c / c基础不错的朋友的一个免费专栏&#xff0c;接下来…...

科技引领未来,中建海龙C-MiC 2.0技术树立模块化建筑新标杆

在建筑行业追求高效与品质的征程中&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;以其卓越的创新能力和强大的技术实力&#xff0c;不断书写着装配式建筑领域的新篇章。1 月 10 日&#xff0c;由深圳安居集团规划&#xff0c;中建海龙与中海建筑共…...

解锁养生秘籍,拥抱健康生活

在这个快节奏的时代&#xff0c;人们行色匆匆&#xff0c;常常在忙碌中忽略了健康。其实&#xff0c;养生并非遥不可及&#xff0c;它就藏在生活的细微之处&#xff0c;等待我们去发现和实践。 规律作息是健康的基础。日出而作&#xff0c;日落而息&#xff0c;顺应自然规律&am…...

STM32 如何使用DMA和获取ADC

目录 背景 ‌摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术&#xff0c;允许某些硬件子系统直接访问系统内存&#xff0c;而不需要中央处理器&#xff08;CPU&#xff09;的介入&#xff0c;从而减轻CPU的负担。我们可以通过DMA来从外设&#xf…...

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法&#xff0c;在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力&#xff0c;而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下&#xff0c;自动对焦可能会失效&#xff0c;从而影响细胞…...

DeepSeek教unity------MessagePack-01

中文&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍&#xff0c;并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏…...

vite+vue3开发uni-app时低版本浏览器不支持es6语法的问题排坑笔记

重要提示&#xff1a;请首先完整阅读完文章内容后再操作&#xff0c;以免不必要的时间浪费&#xff01;切记&#xff01;&#xff01;&#xff01;在使用vitevue3开发uni-app项目时&#xff0c;存在低版本浏览器不兼容es6语法的问题&#xff0c;如“?.” “??” 等。为了方便…...

WPF-数据转换器

一、单值转换器 1.不传参数 转换器 当Value值大于100时返回红色 public class DataConverter : IValueConverter{/// <summary>/// 表示从源到目标数据转换/// </summary>/// <param name"value">数据源的值</param>/// <param name&q…...

蓝桥杯备考:贪心算法之纪念品分组

P1094 [NOIP 2007 普及组] 纪念品分组 - 洛谷 这道题我们的贪心策略就是每次找出最大的和最小的&#xff0c;如果他们加起来不超过我们给的值&#xff0c;就分成一组&#xff0c;如果超过了&#xff0c;就把大的单独成一组&#xff0c;小的待定 #include <iostream> #i…...

Win11配置wsl、ubuntu、docker

系统要求 安装WSL。 开通虚拟化&#xff1a; 准备工作 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartwsl --set-default-versi…...

以mysql驱动为案例,从源码角度深入分析Java的SPI机制

本文将以mysql驱动为案例&#xff0c;深入跟踪源码分析Java的SPI&#xff08;Service Provider Interface&#xff09;机制。 环境 java 8&#xff0c;mysql8.0&#xff0c;mysql-connector-java 8.0.20 代码 public class MysqlConnectorTest {public static void main(St…...

市盈率(P/E Ratio):理解股票价格与盈利的关系(中英双语)

市盈率&#xff08;P/E Ratio&#xff09;&#xff1a;理解股票价格与盈利的关系 今天在阅读《漫步华尔街》&#xff08;原书第13版&#xff09;的过程中&#xff0c;看到了“股票价格是每股盈利的 6 倍”的类似表述&#xff0c;于是产生了本文。 在投资股票时&#xff0c;投资…...

尚硅谷爬虫note008

一、handler处理器 定制更高级的请求头 # _*_ coding : utf-8 _*_ # Time : 2025/2/17 08:55 # Author : 20250206-里奥 # File : demo01_urllib_handler处理器的基本使用 # Project : PythonPro17-21# 导入 import urllib.request from cgitb import handler# 需求&#xff…...

AWS上基于高德地图API验证Amazon Redshift里国内地址数据正确性的设计方案

该方案通过无服务架构实现高可扩展性&#xff0c;结合分页查询和批量更新确保高效处理海量数据&#xff0c;同时通过密钥托管和错误重试机制保障安全性及可靠性。 一、技术栈 组件技术选型说明计算层AWS Lambda无服务器执行&#xff0c;适合事件驱动、按需处理&#xff0c;成…...

matlab汽车动力学半车垂向振动模型

1、内容简介 matlab141-半车垂向振动模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F

「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后&#xff0c;ALINX 进一步研究尖端应用市场&#xff0c;面向 AI 场景进行优化设计&#xff0c;推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…...

智能硬件定位技术发展趋势

在科技飞速进步的当下&#xff0c;智能硬件定位技术作为众多领域的关键支撑&#xff0c;正沿着多元且极具创新性的路径蓬勃发展&#xff0c;持续重塑我们的生活与工作方式。 一、精度提升的极致追求 当前&#xff0c;智能硬件定位精度虽已满足诸多日常应用&#xff0c;但未来…...

【Elasticsearch】`nested`和`flattened`字段在索引时有显著的区别

有同学问&#xff0c;nested查询效率不高为啥不直接扁平化查询呢&#xff1f;就跟之前的普通结构查询一样&#xff0c;这就有些想当然了&#xff0c;因为扁平化的结构在存储时&#xff0c;其实跟我们想的不一样&#xff0c;接下来给出扁平化在索引时的存储结构(尤其是当嵌套对象…...

【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…...

redis解决高并发看门狗策略

当一个业务执行时间超过自己设定的锁释放时间&#xff0c;那么会导致有其他线程进入&#xff0c;从而抢到同一个票,所有需要使用看门狗策略&#xff0c;其实就是开一个守护线程&#xff0c;让守护线程去监控key&#xff0c;如果到时间了还未结束&#xff0c;就会将这个key重新s…...

Ollama+DeepSeek+Open-WebUi

环境准备 Docker Ollama Open-WebUi Ollama 下载地址&#xff1a;Ollama docker安装ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下载模型 Ollama模型仓库 # 示例&#xff1a;安装deepseek-r1:7b doc…...

MySQL-事务隔离级别

事务有四大特性&#xff08;ACID&#xff09;&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性和持久性。隔离性一般在事务并发的时候需要保证事务的隔离性&#xff0c;事务并发会出现很多问题&#xff0c;包括脏写&#xff0c;脏读&#xff0c;不可重复读&#xff0c;…...

对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端

1. 使用Fetch API发送HTTP请求&#xff08;最简单的方式&#xff09;&#xff1a; //home.html // 示例&#xff1a;提交表单数据到后端 const submitForm async (formData) > {try {const response await fetch(http://your-backend-url/api/submit, {method: POST,head…...

从入门到精通:Postman 实用指南

Postman 是一款超棒的 API 开发工具&#xff0c;能用来测试、调试和管理 API&#xff0c;大大提升开发效率。下面就给大家详细讲讲它的安装、使用方法&#xff0c;再分享些实用技巧。 一、安装 Postman 你能在 Postman 官网&#xff08;https://www.postman.com &#xff09;下…...

error: conflicting types for ‘SSL_SESSION_get_master_key’

$ make make all-am make[1]: Entering directory ‘/home/linuxuser/tor’ CC src/lib/tls/libtor_tls_a-tortls_openssl.o In file included from src/lib/tls/tortls_openssl.c:61: ./src/lib/tls/tortls_internal.h:55:8: error: conflicting types for ‘SSL_SESSION_get_…...

sql sqlserver的特殊函数COALESCE和PIVOT的用法分析

一、COALESCE是一个返回参数中第一个非NULL值的函数&#xff0c; 列如&#xff1a;COALESCE&#xff08;a,b,c,d,e&#xff09;;可以按照顺序取abcde&#xff0c;中的第一个非空数据&#xff0c;abcde可以是表达式 用case when 加ISNULL也可以实现&#xff0c;但是写法复杂了…...

智能猫眼实现流程图

物理端开发流程图 客户端端开发流程图 用户功能开发流程图 管理员开发流程图...

c/c++蓝桥杯经典编程题100道(19)汉诺塔问题

汉诺塔问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 汉诺塔问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;递归法&#xff08;难度★&#xff09; 解法2&#xff1a;迭代法&#xff08;难度★★★&#xff09; 四、C实现 解法1&#xff1…...