菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t

本文深入剖析了nginx源码中的数据结构——ngx_list_t,详细解读了单向链表的实现细节及其在nginx中的应用,帮助读者更好地理解和使用nginx源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t

 

  • Author:Echo Chen(陈斌)

  • Email:chenb19870707@gmail.com

  • Blog:Blog.youkuaiyun.com/chen19870707

    Date:October 23h, 2014

     

    1.ngx_list优势和特点

     

    ngx_list _t是一个顺序容器,它实际上是动态数组和单向链表的结合体,扩容起来比动态数组简单的多,可以一次扩容一个数组,所以说它结合了 链表插入删除不需要移动的 和 数组下标快速索引 的优势,设计非常让人叫绝,此外它还有以下特点:

    • 链表中存储的元素是灵活的,可以是任何一种数据结构。

    • 链表元素需要占用的内存由ngx_list_t管理,它已经通过数组分配好了。
    • 小块的内存使用链表访问O(n)效率是低下的,可以使用数组通过直接通过偏移量来直接访问O(1)。

    2.源代码位置

     

    头文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_list.h

    源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_list.c

     

    3.数据结构定义

     

    前面说到ngx_list_t是一个数组链表,链表中的每个结点都是一个数组,ngx_list_part_t 描述的是链表中的一个结点,这个结点又是一个数组,elts为数组首地址,nelts为该数组已经使用的个数,*next为下一个链表结点的指针,定义如下:

       1: typedef struct ngx_list_part_s  ngx_list_part_t;
       2:  
       3: //描述链表中的一个结点,这个结点又是一个数组
       4: struct ngx_list_part_s {
         
         
       5:     void             *elts;     //首地址
       6:     ngx_uint_t        nelts;    //已经使用的个数
       7:     ngx_list_part_t  *next;     //下一个链表节点的指针
       8: };

     

    ngx_list_t是描述整个链表,其中last 为链表中最后一个数组,part为链表中首个数组,size为数组每个元素占用空间小,nalloc为每个数组可以容纳的元素个数,pool为链表内存池对象,定义如下:

     

       1: typedef struct {
        
        
       2:     ngx_list_part_t  *last;        //链表中最后一个数组元素
       3:     ngx_list_part_t   part;        //链表中的首个数组元素
       4:     size_t            size;        //每个数组元素占用的空间大小
       5:     ngx_uint_t        nalloc;      //每个数组结点的容量,即每个数组最多可以存放多少个元素
       6:     ngx_pool_t       *pool;        //链表中的内存池对象指针
       7: } ngx_list_t;

     

    其结构如下图所示,最下面一行为内存映像,可以看到整个内存中仅仅多了 一个ngx_list_t 和 几个ngx_list_part_s结果,内存并没有太多的浪费,nginx在内存方面的苛刻确实值得我们学习

     

     

    4.链表创建ngx_list_create和初始化ngx_list_init

     

       1: //链表创建,pool为内存池对象,size为每个数组元素的大小,n为每个数组可以容纳的元素个数
       2: ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)
       3: {
         
         
       4:     ngx_list_t  *list;
       5:     
       6:     //分配ngx_list_t结构
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值