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.mzph.cn/news/823143.shtml

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

相关文章

Linux下redis的安装过程与配置详细教程【5.0.5为例子】

Linux下redis的安装过程与配置方法【5.0.5为例子】 下载redis redis下载地址 https://download.redis.io/releases/ 也可以自行去官网下载 提示:此处安装的为redis-5.05的版本 上传redis安装包(我的安装目录为/data/tool/redis-5.0.5) 创建目录/data/local/tool并…

Day20-【Java SE高级】单元测试 反射 注解 动态代理

一、单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码,去调用其他方法进行测试。无法实现自动化测试,一个方法测试失败,可能…

Day 23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

修剪二叉搜索树 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 ​ 最直接的想法&#xff0…

最强解释!Python 包的依赖管理,有解了!

之前一直比较抵触用 Python ,很大一部分原因是觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具,通过 package.json 配置项目依赖,最多再通过 nvm 来进行环境切换;Java 有 Maven Gradle 来进行包管理和项目依赖配置…

python操作Excel文件

python操作Excel小记 不重要 不重要 不重要 不重要 不重要 不重要 def saveData(all_data:list,hotelName:str,hotelIndex:int) -> None:if not os.path.exists(r.\data\酒店数据.xlsx):# Excel文件不存在,则创建Excel文件wb = Workbook()# 创建页表ws = wb.create_sheet(…

今天刷两题(day2)

题目一:最长公共前缀 题目描述: 给你一个大小为 n的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。输入输出描述: 输入:"abca","…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂,牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

C++ 秋招必知必会(数据结构与算法:下)

20. 二叉树的定义与操作 二叉树(binary tree)是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑 与链表类似,二叉树的基本单元是节点,每个节点包含:值、左子…

Vue3---基础6(标签的ref属性)

标签的 ref 属性 作用&#xff1a;用于注册模版引用 用在普通DOM标签上&#xff0c;获取的是DOM节点 用在组件标签上&#xff0c;获取的是组件实例对象 普通DOM标签 <template><div class"person"><h1>中国</h1><h2 ref"2">…

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

储能的全生命周期成本即平准化度电成本的计算方法及python实践

1. 平准化度电成本&#xff08;LCOE&#xff09;是一种衡量电力项目经济性的指标 LCOE&#xff08;Levelized Cost of Energy,&#xff09;的概念最早由美国国家可再生能源实验室&#xff08;NREL&#xff09;在1995年提出&#xff0c;它是通过将一个项目生命周期内的所有成本…

绩效考核:关键绩效指标(KPI)

绩效管理是企业人力资源管理的核心内容之一&#xff0c;而绩效考核又是绩效管理的关键环节。在绩效考核中&#xff0c;关键绩效指标&#xff08;KPI&#xff09;的应用越来越广泛。本文将介绍关键绩效指标&#xff08;KPI&#xff09;的概念、意义、制定方法以及应用实例&#…

黑马头条项目结构

微服务架构具有许多优点&#xff0c;其中一些主要优点包括&#xff1a; 松耦合性&#xff1a;每个微服务都是独立的&#xff0c;可以独立部署、独立扩展和独立更新&#xff0c;这种松耦合性使得系统更加灵活&#xff0c;易于维护和演化。 技术多样性&#xff1a;由于每个微服务…

基于springboot实现知识管理系统项目【项目源码+论文说明】

基于springboot实现知识管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求&#xff0c;创建了…

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目+题解+在线评测【二分】

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目题解在线评测【二分】 题目描述&#xff1a;输入描述输出描述样例 解题思路一&#xff1a;python解题思路二&#xff1a;c解题思路三&#xff1a;0 题目描述&#xff1a; 塔子哥拿到了一个数组&#xff0c;她有q次查询…

HTTP/1.1特性总结

优点 【简单&#xff0c;灵活和易于扩展&#xff0c;应用广泛和跨平台】 1.简单&#xff1a; http基本的报文格式就是headerbody&#xff0c;头部信息也是key-value简单的文本形式&#xff0c;易于理解&#xff0c;降低了学习和使用的门槛 2.灵活和易于扩展&#xff1a; &…

Redis 配置与使用 (Linux 虚拟机Windows客户端)

Centos7 安装Redis详细教程 - JcongJason - 博客园 (cnblogs.com) 安装 下载redis安装包并解压 # 下载&#xff0c;我是在root下执行的下载&#xff0c;所以我的下载目录为&#xff1a;/root/redis-5.0.5&#xff0c;这里按照自己的实际情况调整 wget https://download.redi…

Java常用的几种设计模式

单例模式&#xff1a; volatile /ˈvɒlətaɪl/ 不稳定的&#xff1b;Java中的一个关键字&#xff0c;主要用于修饰变量。其主要作用是保证变量的可见性和有序性。 单例模式有两种模式&#xff0c;懒汉模式和饿汉模式。一个类private修饰其构造方法使其无法对外new出来。 饿…

Methoxy PEG Glutaric Acid可以改善物质的溶解性、稳定性和生物相容性

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

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…