Ubuntu下nginx-1.24.0源码分析-ngx_create_pool函数
- 软件开发
- 2025-09-03 18:15:02

ngx_create_pool
声明在 src\core\ngx_palloc.h 中
ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);实现在 src\core\ngx_palloc.c 中
ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) { ngx_pool_t *p; p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); if (p == NULL) { return NULL; } p->d.last = (u_char *) p + sizeof(ngx_pool_t); p->d.end = (u_char *) p + size; p->d.next = NULL; p->d.failed = 0; size = size - sizeof(ngx_pool_t); p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; p->current = p; p->chain = NULL; p->large = NULL; p->cleanup = NULL; p->log = log; return p; }函数签名 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log) 功能 :创建一个大小为 size 的内存池,并返回指向该内存池的指针。参数 : size:指定内存池的总大小。log:日志对象,用于记录错误信息。 返回值 :成功时返回指向内存池的指针,失败时返回 NULL。
定义局部变量 ngx_pool_t *p; 定义一个指针变量 p,用于存储新创建的内存池对象的地址。
分配内存 p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); if (p == NULL) { return NULL; }
调用 ngx_memalign 函数分配一块对齐的内存,大小为 size,对齐方式为 NGX_POOL_ALIGNMENT。
如果分配失败(返回 NULL),直接返回 NULL,表示内存池创建失败。
ngx_memalign
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_memalign函数-CSDN博客
NGX_POOL_ALIGNMENT
定义在 src\core\ngx_palloc.h
#define NGX_POOL_ALIGNMENT 16初始化内存池的 d 域
p->d.last = (u_char *) p + sizeof(ngx_pool_t); p->d.end = (u_char *) p + size; p->d.next = NULL; p->d.failed = 0; p->d.last:指向当前内存池中可用内存的起始位置,初始值为 p 加上 sizeof(ngx_pool_t),即跳过内存池头部结构体。p->d.end:指向内存池的末尾,初始值为 p + size。p->d.next:指向下一个内存池块,默认初始化为 NULL。p->d.failed:记录分配失败的次数,初始值为 0。Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型-CSDN博客
计算最大分配大小
size = size - sizeof(ngx_pool_t); p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;size 减去 sizeof(ngx_pool_t),得到实际可用于分配的内存大小。
将 p->max 设置为较小值:size 或 NGX_MAX_ALLOC_FROM_POOL。
p->max 表示从内存池中分配的最大块大小。
如果请求的内存超过 p->max,则会使用大块内存分配机制(见后续的 large 字段)。
NGX_MAX_ALLOC_FROM_POOL
Ubuntu 下 nginx-1.24.0 源码分析 - NGX_MAX_ALLOC_FROM_POOL-CSDN博客
初始化其他字段 p->current = p; p->chain = NULL; p->large = NULL; p->cleanup = NULL; p->log = log; p->current:指向当前正在使用的内存池块,初始值为 p。p->chain:指向内存池链表,默认初始化为 NULL。p->large:指向大块内存分配链表,默认初始化为 NULL。p->cleanup:指向清理回调函数链表,默认初始化为 NULL。p->log:保存日志对象,用于记录错误信息。 返回内存池指针 return p; 返回指向新创建的内存池对象的指针。
Ubuntu下nginx-1.24.0源码分析-ngx_create_pool函数由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Ubuntu下nginx-1.24.0源码分析-ngx_create_pool函数”