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 数组,直到所有节点处理完毕。

相关推荐
信创天地2 小时前
国产堡垒机部署实战:以奇安信、天融信为例构建运维安全三重防线
运维·安全
呉師傅3 小时前
东芝3525AC彩色复印机CC219测试页打印方法【实际操作】
运维·网络·windows·计算机外设·电脑
宴之敖者、4 小时前
Linux——权限
linux·运维·服务器
oscar9994 小时前
构建敏捷团队的DevOps测试策略:速度与可靠性的平衡艺术
运维·测试·devops
星辰&与海5 小时前
Proxmox导入虚拟机后进入dracut紧急模式
运维
Serverless社区6 小时前
进阶指南:BrowserUse + Agentrun Sandbox 最佳实践指南
运维·阿里云·云原生·serverless·函数计算
Maggie_ssss_supp6 小时前
Linux-MySQL权限管理
linux·运维·mysql
石像鬼₧魂石6 小时前
Kali Linux 内网渗透:深度工程实施手册
linux·运维·服务器
运维螺丝钉7 小时前
docker安装应用
运维·docker·容器
以太浮标8 小时前
华为eNSP模拟器综合实验之- 路由表RIB和转发表FIB的关联解析
运维·网络·华为·信息与通信