ngx_pool_t
定义在 src/core/ngx_core.h
typedef struct ngx_pool_s ngx_pool_t;
ngx_pool_s
定义在 src/core/ngx_palloc.h
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;ngx_log_t *log; };
ngx_pool_s
的主要作用是实现一个内存池(memory pool) ,为 Nginx 提供高效、低开销的内存分配和释放机制。它的设计目标包括:
- 减少频繁调用系统级的内存分配函数(如
malloc
和free
),从而提高性能。- 简化内存释放:当内存池不再使用时,只需一次性释放整个内存池,而不需要逐个释放每个小块内存。
- 支持大块内存分配(通过
large
字段)和清理回调(通过cleanup
字段)。
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; // 清理回调链表ngx_log_t *log; // 日志对象,用于记录错误信息 };
ngx_pool_data_t
在 src\core\ngx_palloc.h
typedef struct {u_char *last;u_char *end;ngx_pool_t *next;ngx_uint_t failed; } ngx_pool_data_t;
last
: 指向当前内存块中未分配内存的起始位置。每次分配内存时,从last
开始分配,并更新last
。end
: 指向当前内存块的末尾位置。如果last
超过end
,表示当前内存块已满,需要分配新的内存块。next
: 指向下一个内存块。Nginx 的内存池是由多个内存块组成的链表。failed
: 记录分配失败的次数。如果某个内存块的分配失败次数过多,Nginx 会跳过该内存块,直接尝试分配新的内存块。
ngx_pool_large_t
定义在 src\core\ngx_palloc.h
typedef struct ngx_pool_large_s ngx_pool_large_t;struct ngx_pool_large_s {ngx_pool_large_t *next;void *alloc; };
next
- 类型:
ngx_pool_large_t *
- 含义:指向下一个
ngx_pool_large_s
节点的指针。- 作用:
ngx_pool_large_s
使用单向链表的形式组织所有分配的大块内存。通过next
指针,可以遍历整个链表,方便管理和释放这些大块内存。
alloc
- 类型:
void *
- 含义:指向实际分配的大块内存的指针。
- 作用:
alloc
存储了通过系统调用(如malloc
)分配的大块内存的地址。Nginx 在需要释放内存池时,可以通过遍历链表并逐个释放这些大块内存。
大块内存分配流程
当请求的内存超过阈值时:
- 调用
ngx_alloc
从系统分配所需内存。- 创建
ngx_pool_large_s
节点,alloc
指向新分配的内存。- 将新节点插入链表
内存池结构关系
pool[ngx_pool_t] -->|large| large1[ngx_pool_large_t]large1 -->|next| large2[ngx_pool_large_t]large2 -->|next| large3[ngx_pool_large_t]large3 -->|next| NULLlarge1 --> alloc1[Alloc Memory]large2 --> alloc2[Alloc Memory]large3 --> alloc3[Alloc Memory]
内存池 (ngx_pool_t) │ ├── ... 其他成员 ... │ └── large → [large_node1] → [large_node2] → ... → NULL│ │ │alloc alloc alloc↓ ↓ ↓[Memory1] [Memory2] [Memory3]
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型
2025/2/21 4:48:04
来源:https://blog.csdn.net/weixin_41812346/article/details/145679905
浏览:
次
关键词:Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- 华为 海思22AP10(SS524)H.265 编解码处理器用户指南
- 数据库物理结构设计
- 如何在 Mac 上清空硬盘后恢复丢失的数据?
- npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
- 基于重要抽样的主动学习不平衡分类方法ALIS
- 《缺失MRI模态下的脑肿瘤分割的潜在相关表示学习》| 文献速递-深度学习肿瘤自动分割
- 大模型分离架构学习记录
- (2)Django生产环境数据库的切换以及环境配置python-dotenv方案
- 【微信小程序】自定义组件 - 组件的生命周期
- vue项目——页面绑定回车Enter事件,进入页面路由和离开页面路由解绑事件——js技能提升