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

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

ngx_pnalloc

声明在 src\core\ngx_palloc.h 

void *ngx_pnalloc(ngx_pool_t *pool, size_t size);

定义在 src\core\ngx_palloc.c 

void *
ngx_pnalloc(ngx_pool_t *pool, size_t size)
{
#if !(NGX_DEBUG_PALLOC)if (size <= pool->max) {return ngx_palloc_small(pool, size, 0);}
#endifreturn ngx_palloc_large(pool, size);
}

Nginx 的内存池是一种分层的内存管理机制,主要分为小块内存分配和大块内存分配两种模式:

  1. 小块内存分配 :从预先分配的内存块中分配内存,避免频繁调用系统级的 mallocfree
  2. 大块内存分配 :直接调用系统级的 malloc 分配大块内存,适用于超出小块内存分配范围的情况。

这种设计的目标是减少内存碎片、提高分配效率,并通过集中管理内存生命周期来简化内存释放操作

 

该函数的作用是从指定的内存池中分配一块大小为 size 的内存。根据分配的大小,它会选择不同的分配策略(小块或大块) 

函数原型

void *ngx_pnalloc(ngx_pool_t *pool, size_t size);
  • 参数说明

    • pool:指向当前内存池的指针。
    • size:需要分配的内存大小。
  • 返回值

    • 成功时返回分配的内存地址。
    • 失败时返回 NULL

 

预处理宏 #if !(NGX_DEBUG_PALLOC)

#if !(NGX_DEBUG_PALLOC)

 这是一个条件编译指令,用于控制是否启用调试模式

  • 如果未定义 NGX_DEBUG_PALLOC 宏,则执行后续代码。
  • 如果定义了 NGX_DEBUG_PALLOC,则跳过这部分代码,直接进入大块内存分配逻辑

 判断内存大小是否适合小块分配

if (size <= pool->max) {

判断请求的内存大小是否小于等于 pool->max

pool->max 是内存池的一个属性,表示小块内存分配的最大限制。

如果 size 小于等于 pool->max,说明可以从小块内存池中分配。

 调用小块内存分配函数

return ngx_palloc_small(pool, size, 0);

调用 ngx_palloc_small 函数进行小块内存分配。

  • 参数说明
    • pool:当前内存池。
    • size:需要分配的内存大小。
    • 0:表示不进行对齐操作(即按需分配,无需额外填充)

ngx_palloc_small 是一个小块内存分配器,它会尝试从内存池的空闲链表中分配内存。

如果当前内存池的空闲空间不足,则会创建一个新的内存块并挂载到内存池中。


ngx_palloc_small

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

调用大块内存分配函数 

return ngx_palloc_large(pool, size);

调用 ngx_palloc_large 函数进行大块内存分配

当请求的内存大小超过 pool->max 时,直接调用系统级的 malloc 分配内存。

分配的内存会被记录在内存池的大块内存链表中,以便在内存池销毁时统一释放


ngx_palloc_large

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

http://www.lryc.cn/news/539017.html

相关文章:

  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析①】
  • A与B组件自动对齐与组装,无映射直接补偿。
  • QT 读写锁
  • C++ 的时间库之二:Ratio
  • 使用小雅xiaoya/Emby正确的观看电影电视剧的姿势
  • Java状态机
  • 【Pandas】pandas Series isin
  • 通过VSCode直接连接使用 GPT的编程助手
  • 一种最常见的js加密解密
  • 【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析
  • SMOJ 一笔画/洛谷 P7171 COCI 2020/2021 #3 Selotejp 题解
  • 【Java学习】继承
  • 计时器任务实现(保存视频和图像)
  • 树莓百度百科能否揭开成都树莓集团的神秘面纱?
  • 【如何看懂数据手册和原理图】
  • SQL 优化工具使用之 explain 详解
  • 深度解析Unity3D渲染管线:网格、材质与GPU渲染的协同逻辑
  • POI优化Excel录入
  • 实时图像与视频超分辨率:高效子像素卷积网络(ESPCN)解析
  • QT--对话框的切换
  • 深入浅出:CUDA是什么,如何利用它进行高效并行计算
  • Zotero PDF Translate插件配置百度翻译api
  • 利用acme.sh 申请 Google 免费证书
  • 腾讯云cloudstudio使用笔记(一)
  • python自动化制作常规的日报数据可视化
  • C语言:在主函数中输入十个等长的字符串。用另一函数对它们排序,然后在主函数输出这10个已排好序的字符串。
  • 构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
  • SQLMesh 系列教程5- 详解SQL模型
  • 本地DeepSeek模型GGUF文件转换为PyTorch格式
  • Flutter:动态表单(在不确定字段的情况下,生成动态表单)