Nginx内存池相关源码剖析(一)总览

剖析nginx的内存池源码,讲解原理实现以及该内存池设计的应用场景

介绍 

Nginx内存池是Nginx为了优化内存管理而引入的一种机制。在Nginx中,每个层级(如模板、TCP连接、HTTP请求等)都会创建一个内存池进行内存管理。当这些层级的生命周期结束时,整个内存池会被销毁,将分配的内存一次性归还给操作系统。

Nginx内存池的主要优势体现在:

  1. 减少频繁的malloc和free操作:通过内存池,避免了频繁的动态内存申请和释放,从而降低了内存管理的开销。
  2. 防止内存泄漏:内存池可以有效地避免因为申请未释放、二次释放或异常流程未释放而导致的内存泄漏问题。
  3. 提高内存使用效率:内存池可以优化内存的分配和回收,避免内存碎片的产生,从而提高内存的利用率。
  4. 提高系统稳定性:通过内存池,系统能够更好地管理内存资源,减少因为内存问题引发的异常,从而增强系统的稳定性和健壮性。

在Nginx的内存池中,内存被分为小块内存和大块内存。对于小块内存,用户申请后并不需要释放,而是等待释放内存池时再释放。对于大块内存,用户可以调用相关接口进行释放,也可以等内存池释放时再释放。同时,Nginx内存池支持增加回调函数,当内存池释放时,自动调用回调函数释放用户申请的资源。

Nginx内存池为Nginx提供了高效、稳定的内存管理机制,为项目开发和服务器运行提供了更加可靠的基础。

重要类型定义

nginx内存池重要函数接口

// nginx内存池的主结构体类型
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; // 清理函数handler的入口指针ngx_log_t *log;
};
typedef struct ngx_pool_s ngx_pool_t;
// 小块内存数据头信息
typedef struct {u_char *last; // 可分配内存开始位置u_char *end; // 可分配内存末尾位置ngx_pool_t *next; // 保存下一个内存块的地址ngx_uint_t failed; // 记录当前内存池分配失败的次数
} ngx_pool_data_t;
typedef struct ngx_pool_large_s ngx_pool_large_t;
// 大块内存类型定义
struct ngx_pool_large_s {ngx_pool_large_t *next; // 下一个大块内存void *alloc; // 记录分配的大块内存的起始地址
};
typedef void (*ngx_pool_cleanup_pt)(void *data); // 清理回调函数的类型定义typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t;
// 清理操作的类型定义,包括一个清理回调函数,传给回调函数的数据和下一个清理操作的地址
struct ngx_pool_cleanup_s {ngx_pool_cleanup_pt handler; // 清理回调函数void *data; // 传递给回调函数的指针ngx_pool_cleanup_t *next; // 指向下一个清理操作
};

内存池每块的结构:

ngx_pool_s作为整个内存池的头信息,只有第一个内存块才有,其维护小块内存入口地址、大块内存入口地址、清理函数的入口指针等内存池全局信息;

ngx_pool_data_t是每个内存块都有,记录本小块内存的信息,包括本块内存的起始可分配位置、末尾可分配位置、下一块的地址链接等;

ngx_pool_large_s是保存大块内存的头信息,其保存大块内存的真正起始地址和下一个大块内存的头信息地址,这个头信息自身由于数据量小,也存放在小块内存中;

ngx_pool_cleanup_s保存清理相关操作,在内存池销毁的时候才成链的去调用。

nginx内存池重要函数接口

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); // 创建内存池
void ngx_destroy_pool(ngx_pool_t *pool); // 销毁内存池
void ngx_reset_pool(ngx_pool_t *pool); // 重置内存池
void *ngx_palloc(ngx_pool_t *pool, size_t size); // 内存分配函数,支持内存对齐
void *ngx_pnalloc(ngx_pool_t *pool, size_t size); // 内存分配函数,不支持内存对齐
void *ngx_pcalloc(ngx_pool_t *pool, size_t size); // 内存分配函数,支持内存初始化0
ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p // 内存释放(大块内存)ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size); // 添加清理
handler

目录

点击右下方专栏即可查看~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/312482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手动实现简易版RPC(下)

手动实现简易版RPC(下) 前言 什么是RPC?它的原理是什么?它有什么特点?如果让你实现一个RPC框架,你会如何是实现?带着这些问题,开始今天的学习。 接上一篇博客 手动实现简易版RPC(上&#xff…

【YOLOv9】完胜V8的SOTA模型Yolov9(论文阅读笔记)

官方论文地址: 论文地址点击即可跳转 官方代码地址: GitCode - 开发者的代码家园 官方代码地址点击即可跳转 1 总述 当输入数据经过各层的特征提取和变换的时候,都会丢失一定的信息。针对这一问题: 论文中提出的可编程梯度信息…

MATLAB实现遗传算法优化BP神经网络预测数值(GABP)

遗传算法(Genetic Algorithm, GA)和反向传播(Back Propagation, BP)神经网络是两种强大的算法,分别用于优化和机器学习。将遗传算法与BP神经网络结合,可以利用遗传算法的全局搜索能力来优化BP神经网络的初始…

Socket 通信机制详解

Socket 是网络编程中一种重要的通信机制,它允许不同的计算机通过网络进行数据交换。 一、 Socket 的概念 Socket(套接字)是计算机网络编程中的一种抽象,它提供了在网络上进行通信的接口。 Socket 本质上是一种通信的端点&#…

C++ ─── 类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 3.1 类的成员函数两种定义方式: 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 结构体内存对齐规则 8.this指针 …

CSS display属性

目录 概述: 设置display示例: none: block: inline: inline-block : 概述: 在CSS中我们可以使用display属性来控制元素的布局,我们可以通过display来设置元素的类型。 在不设置…

IO-序列化流

简介 这个流是为了传输对象而生的对象序列化:把java对象写入到文件中对象反序列化:把文件中的对象读出来 继承体系 ObjectInputStream:把文件中的对象读出来ObjectOutputStream:把java对象写入到文件中 常用API 示例 实体类必须实现序列化接口这其实就是…

【Excel2LaTeX】复杂表格制作的解决方案

刚开始用LaTeX写论文,遇到的第一道坎就是绘制表格,较小的普通表格可以通过简单的语法实现,但是较大的复杂的表格却让我无从下手。 Excel2LaTeX插件 这里介绍一种我用到非常顺手的工具:Excel2LaTeX插件,下载地址&#x…

C语言 【函数】

1.函数概述 函数是一种可重用的代码块&#xff0c;用于执行特定任务或完成特定功能 函数作用&#xff1a;对具备相同逻辑的代码进行封装&#xff0c;提高代码的编写效率&#xff0c;实现对代码的重用 2. 函数的使用 2.1 无参无返回值 #include <stdio.h>// 函数名…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具&#xff0c;该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥&#xff0c;以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…

Methoxy PEG Propionic acid具有良好的亲水性和分子量可控性

【试剂详情】 英文名称 mPEG-PA&#xff0c;mPEG-Propionic acid&#xff0c; Methoxy PEG PA&#xff0c; Methoxy PEG Propionic acid 中文名称 聚乙二醇单甲醚丙酸&#xff0c; 甲氧基-聚乙二醇-丙酸 外观性状 由分子量决定&#xff0c;固体或者液体 分子量 400&…

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…

粒子群算法及基于该算法的典型问题求解实践

说明 我在上个月(3.15&#xff0c;时间过得真快&#xff0c;已经一个月了…)写了两篇关于遗传算法的博文[1]&#xff1a;遗传算法及基于该算法的典型问题的求解实践-CSDN博客 和[2]&#xff1a;基于遗传算法的波束形成优化-仿真实践-CSDN博客&#xff0c;当时关注到该算法时&am…

Vuforia AR篇(一)— 开启AR之门

目录 前言一、 Vuforia Engine简介二、主要功能与特点2.1 图像识别2.2 VuMarks技术2.3 多目标识别2.4 圆柱体目标识别2.5 平面跟踪技术2.6 云服务支持2.7 模型目标识别2.8 区域目标识别 三、平台兼容性四、技术实现结语 前言 随着科技的不断发展&#xff0c;增强现实&#xff…

授权协议OAuth 2.0之如何接入授权服务

写在前面 为了能够更好以场景化的方式来理解OAuth2.0&#xff0c;本文一起看下&#xff0c;假定我们现在要开发一个交友类软件&#xff0c;为了提高用户登录的便利程度&#xff0c;需要对接微信开放平台&#xff0c;获取到用户的微信账号信息&#xff0c;作为用户的注册信息来…

Java面试八股文(JVM篇)(❤❤)

Java面试八股文_JVM篇 1、知识点汇总2、知识点详解&#xff1a;3、说说类加载与卸载11、说说Java对象创建过程12、知道类的生命周期吗&#xff1f;14、如何判断对象可以被回收&#xff1f;17、调优命令有哪些&#xff1f;18、常见调优工具有哪些20、你知道哪些JVM性能调优参数&…

Unity Pro 2019 for Mac:专业级游戏引擎,助力创意无限延伸!

Unity Pro 2019是一款功能强大的游戏开发引擎&#xff0c;其特点主要体现在以下几个方面&#xff1a; 强大的渲染技术&#xff1a;Unity Pro 2019采用了新的渲染技术&#xff0c;包括脚本化渲染流水线&#xff0c;能够轻松自定义渲染管线&#xff0c;通过C#代码和材料材质&…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可&#xff1a; 全局安装脚手架工具&#xff1a; npm install -g create-react-app创建项目my-react-app&#xff1a; create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom&#xff1a; yarn add react-router-dom启动项…

第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

汽车咨询|基于SprinBoot的汽车资讯管理系统设计与实现(源码+数据库+文档)

汽车资讯管理系统目录 基于SprinBoot的汽车资讯管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff…