Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑

2024-04-16 16:44

本文主要是介绍Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

与小块内存不同,大块内存通常指的是那些大小较大、分配和释放频率相对较低的内存块。

ngx_palloc_large函数

当Nginx需要分配一块大块内存时,它通常会直接调用操作系统的内存分配函数(如malloc、calloc或posix_memalign等)。这些函数会根据请求的大小在操作系统的内存空间中寻找一块合适的连续内存区域,并将其分配给Nginx使用。由于大块内存的大小通常较大,因此操作系统能够更容易地找到满足需求的连续内存空间。

在分配大块内存时,Nginx通常不会过多进行额外的内存池检查或预分配操作。这是因为大块内存的分配和释放相对较为罕见,且频繁地进行内存池检查会增加不必要的开销。

源码及注释:

static void *ngx_palloc_large(ngx_pool_t *pool, size_t size)
{void              *p;ngx_uint_t         n;ngx_pool_large_t  *large; // 结构体中有下块地址next和本块内存地址allocp = ngx_alloc(size, pool->log); // malloc 开辟大块内存 if (p == NULL) {return NULL;}n = 0;for (large = pool->large; large; large = large->next) {// 复用大块内存头信息体链表中,现有的空头信息体// alloc为空是先前通过pfree函数释放的// 此举是为了不去创建新的大内存头信息体,复用之前归还的大内存头信息体if (large->alloc == NULL) { large->alloc = p;return p;}if (n++ > 3) { // 防止找的次数太多浪费时间break;}}// 在小块内存池中,存放大块内存的头信息体large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1); if (large == NULL) { // 没有开辟成功ngx_free(p); // 把新创建的大块内存空间free掉return NULL;}large->alloc = p; // 头结点记录大块内存的地址信息large->next = pool->large; // 大块内存头信息体 头插法进链表pool->large = large;return p;
}

大块内存结构示意图:

ngx_alloc内存分配函数

ngx_alloc也是平台相关的alloc函数,不必纠结:

ngx_pfree大块内存释放函数

ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p) // 释放大块内存,不释放小块内存
{ngx_pool_large_t  *l;for (l = pool->large; l; l = l->next) {if (p == l->alloc) {ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,"free: %p", l->alloc);ngx_free(l->alloc); // 可理解为free函数,释放内存l->alloc = NULL; // 头信息体中地址域置空return NGX_OK; // #define  NGX_OK          0}}return NGX_DECLINED; // #define  NGX_DECLINED   -5
}

ngx_free——平台相关的free函数

总结

Nginx对于大块内存是调用系统的内存分配函数,然后将内存地址通过信息结构体进行管理。

当Nginx不再需要一块大块内存时,它会调用操作系统的内存释放函数(如free)来将内存归还给操作系统。与分配过程类似,Nginx在释放大块内存时也不会进行额外的内存池管理操作。相反,它会依赖于操作系统的内存管理机制来自动处理内存碎片和回收工作。

相对于小块内存的只有分配逻辑没有释放逻辑,大块内存两者都有。

这篇关于Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909345

相关文章

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

Nginx 访问 /root/下 403 Forbidden问题解决

《Nginx访问/root/下403Forbidden问题解决》在使用Nginx作为Web服务器时,可能会遇到403Forbidden错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录解决 Nginx 访问 /root/test/1.html 403 Forbidden 问题问题复现Ng