Ubuntu 下 nginx-1.24.0 源码分析 - ngx_list_t

ngx_list_t


定义src/core/ngx_list.h

c 复制代码
typedef struct {
    ngx_list_part_t  *last;
    ngx_list_part_t   part;
    size_t            size;
    ngx_uint_t        nalloc;
    ngx_pool_t       *pool;
} ngx_list_t;

ngx_list_t 是 Nginx 中用于管理动态数组链表的核心数据结构,结合了数组的高效访问和链表的动态扩展特性。以下是对该结构体及其成员的详细解释:


成员详解

1. ngx_list_part_t *last
  • 作用 :指向链表的最后一个节点(ngx_list_part_t 类型)。
  • 意义
    • 用于快速定位链表的末尾,方便在链表尾部追加新元素。
    • 当需要添加元素时,直接检查 last 指向的节点是否还有剩余空间。如果已满,则分配新节点并更新 last

2. ngx_list_part_t part
  • 作用:链表的首个节点(头节点)。
  • 意义
    • 作为链表的起始点,遍历链表时从 part 开始。
    • 结构体直接内嵌第一个节点,减少一次内存分配(避免单独为头节点分配内存)。

3. size_t size
  • 作用:链表中每个元素的大小(以字节为单位)。
  • 意义
    • 确保每个节点分配的内存块能容纳固定大小的元素(例如存储 HTTP 头字段时,每个元素是 ngx_table_elt_t 类型)。
    • 在初始化链表时指定,后续所有元素必须严格匹配该大小。

4. ngx_uint_t nalloc
  • 作用:每个节点预分配的元素个数。
  • 意义
    • 决定每个节点的容量(nalloc * size 字节),平衡内存占用和分配频率。
    • 较大的 nalloc 减少内存分配次数,但可能浪费内存;较小的 nalloc 节省内存,但增加分配开销。
    • 在初始化链表时指定,通常根据实际场景调整(如 Nginx 默认使用 20)。

5. ngx_pool_t *pool
  • 作用 :指向内存池(ngx_pool_t 类型)。
  • 意义
    • 所有内存分配(节点、元素)均通过内存池完成,避免频繁调用 malloc/free,提升性能。
    • 内存池的生命周期管理链表的内存,链表销毁时由内存池统一回收,防止内存泄漏。

链表节点结构 ngx_list_part_t

每个节点(ngx_list_part_t)的定义如下:

c 复制代码
typedef struct ngx_list_part_s  ngx_list_part_t;
struct ngx_list_part_s {
    void             *elts;    // 指向元素数组的指针
    ngx_uint_t        nelts;   // 当前节点中已使用的元素个数
    ngx_list_part_t  *next;    // 指向下一个节点的指针
};
  • elts :指向实际存储元素的内存块,大小为 nalloc * size
  • nelts :当前节点中已存储的元素数量,初始为 0,随元素添加递增。
  • next:指向下一个节点,形成链表结构。

工作原理

  1. 初始化

    • 通过 ngx_list_init() 初始化链表,指定 sizenallocpool
    • 头节点 part 被初始化,last 指向 part
  2. 添加元素

    • 检查 last 节点的 nelts 是否小于 nalloc。若有空间,直接追加元素到 elts
    • 若无空间,分配新节点(通过 pool),更新 last->next 指向新节点,并将 last 移动到新节点。
  3. 遍历元素

    • part 开始,遍历每个节点的 elts 数组,直到所有节点处理完毕。

相关推荐
Sapphire~5 分钟前
Linux-06 ubuntu 系统截图软件使用简单记录
linux·运维·ubuntu
高级IT技术专家secops99813 分钟前
在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理
运维·服务器·git·系统安全·kylin
我也不曾来过126 分钟前
list底层原理
数据结构·c++·list
工头阿乐28 分钟前
Appium自动化开发环境搭建
运维·appium·自动化
自由鬼30 分钟前
开源漏洞扫描器:OpenVAS
运维·服务器·安全·网络安全·开源·漏洞管理
難釋懷32 分钟前
Shell脚本-while循环语法结构
linux·运维·服务器·bash
B64A-消闲1 小时前
shell命令一
linux·运维
難釋懷2 小时前
Shell脚本-for循环应用案例
linux·运维·服务器·bash
昊昊昊昊昊明2 小时前
10天学会嵌入式技术之51单片机-day-7
linux·运维·网络
Sonetto19992 小时前
Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?
运维·前端·nginx