nginx的list比较简单,主要在文件src/core/ngx_list.h和src/core/ngx_list.c两个文件中,可以说是麻雀虽小,五脏俱全。

1、ngx_list的结构

其定义如下:

struct ngx_list_part_s {void             *elts;  //元素的首地址ngx_uint_t        nelts; //元素的个数ngx_list_part_t  *next;  //指向下一个链表块,构成链表
};//可以认为是管理链表的单元
typedef struct {ngx_list_part_t  *last;    //指向list_part构成的链表的最后一个list_partngx_list_part_t   part;      //表示list_part构成的链表的每一个partsize_t            size;       //表示part中每个元素的大小 ngx_uint_t        nalloc;  //表示part中可以容纳最大的元素个数ngx_pool_t       *pool;
} ngx_list_t;

UML结构图表示为

2、ngx_list的操作

2.1 创建初始化

创建是由函数ngx_list_create来完成,当中调用了函数ngx_list_init

static ngx_inline ngx_int_t
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{list->part.elts = ngx_palloc(pool, n * size);   //内存池中分配part的元素elts数组,容量为n,每个元素大小为sizeif (list->part.elts == NULL) {return NGX_ERROR;}list->part.nelts = 0;      //元素个数为0list->part.next = NULL;list->last = &list->part;   //将last指针指向第一个partlist->size = size;            //初始化元素大小 list->nalloc = n;         //初始化容量list->pool = pool;       return NGX_OK;
}

创建初始化时的结构分布图为

2.2 向list中添加元素

添加元素是由函数ngx_list_push,其实现为

void *
ngx_list_push(ngx_list_t *l)
{void             *elt;ngx_list_part_t  *last;last = l->last;//如果list_part中的已经填充满if (last->nelts == l->nalloc) {/* the last part is full, allocate a new list part *///在内存池中申请list_partlast = ngx_palloc(l->pool, sizeof(ngx_list_part_t));if (last == NULL) {return NULL;}//申请eltslast->elts = ngx_palloc(l->pool, l->nalloc * l->size);if (last->elts == NULL) {return NULL;}last->nelts = 0;last->next = NULL;//设置list的last指针指向新申请的list_part,串成链表l->last->next = last;l->last = last;}elt = (char *) last->elts + l->size * last->nelts;last->nelts++;return elt;
}

list_push后的结构图为



nginx的list数据结构相关推荐

  1. 【Nginx】基本数据结构

    整型的封装 typedef intptr_t ngx_int _t;//有符号整型 typedef uintptr_t ngx_uint_t;//无符号整型 字符串的封装 typedef struct ...

  2. Nginx基本数据结构之ngx_str_t

    nginx的作者为追求极致的高效,自己实现了很多颇具特色的nginx风格的数据结构以及公共函数.比如,nginx提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数ngx_copy等.所以,在我 ...

  3. 后台开发【一大波有用知识】Nginx数据结构剖析

    Nginx数据结构 就是nginx源码里面该怎么去看里面有哪些东西? 核心的第一点就是把基础组建这一块,就是把我们在nginx源码里面的一些数据结构,得需要捋一遍. 数据结构这里面包含哪些东西,,就现 ...

  4. 通过ngx-lua来统计Nginx上的虚拟主机性能数据

    Web server调研分析 Filed under: Web Server - cmpan @ 2012-10-29 20:38:34 摘要 简单可依赖的架构首先需要有一个简单可依赖的前端WebSe ...

  5. nginx子请求并发处理

    https://blog.csdn.net/ApeLife 子请求并非http协议标准的实现,可以说是nginx所特有的设计, 为什么需要子请求呢? 一般认为这主要是为了提高nginx内部对单个客户端 ...

  6. Nginx学习笔记(一)

    Nginx初识 Nginx架构 Nginx在后台运行包含一个master进程和多个worker进程.所以Nginx一般以<u>多进程</u>方式运行,且支持**<u> ...

  7. Nginx 模块开发

    Nginx 模块概述 Nginx 模块有三种角色: 处理请求并产生输出的 Handler 模块: 处理由 Handler 产生的输出的 Filter(滤波器)模块: 当出现多个后台服务器时,Load- ...

  8. 《深入理解NGINX 模块开发与架构解析》之摘抄学习

    1.基于Nginx框架开发程序有5个优势: (1).Nginx将网络.磁盘及定时器等异步事件的驱动都做了非常好的封装,基于它开发将可以忽略这些事件处理的细节; (2).Nginx封装了许多平台无关的接 ...

  9. Nginx的主要函数调用关系分析

    感觉上次写的: http://blog.csdn.net/houjixin/article/details/59658022 这篇总结没把Nginx最主要的函数调用关系说清楚,因此,这次又重新组织了一 ...

最新文章

  1. ​超大规模时空数据的分布式存储与应用
  2. select 统计数量_leetcode题库-sql练习精讲系列--十三、简单分组统计类问题
  3. CDS view里inner join, left outer join和association的区别
  4. CSS样式如何解决IE浏览器不同版本的兼容问题
  5. 普通用户无法执行java,CentOS tomcat普通用户执行配置安装
  6. android钱包nfc功能,Android NFC(二)M1卡电子钱包功能
  7. 现在php内存使用,php 内存使用信息代码
  8. 利用excel做简单的曲线拟合并生成公式
  9. Robotframework之下拉列表select
  10. 计算机ifand函数补考科目,Excel函数公式:逻辑函数IF、AND、OR、NOT、IFERROR实用技巧解读...
  11. linux rpm 装 mac,linux之 rpm,yum
  12. 不敢相信!那些真实存在的机器人女友们!
  13. 计算机怎样保存文档,【2人回答】怎么在电脑上写文档并保存?-3D溜溜网
  14. 如何选择日志审计系统
  15. 超级简单却又非常好吃的一顿饭——排骨汤
  16. [运算放大器]佛朗哥笔记 - 非线性电路 - 模拟开关
  17. C# 中用 Sqlparameter 的几种用法
  18. 冯登国院士:关键信息基础设施安全保护的三个视角
  19. 下载echarts地图资源包
  20. 2019.9.3 随笔(2):智能工厂的主要技术

热门文章

  1. Start Activity for Result(Bug)
  2. SharePoint之备份网站所有内容
  3. [导入]在ASP.NET+ORACLE添加数据记录并让ID自动增量
  4. python怎么读取txt文件数据保存数组中-python将txt等文件中的数据读为numpy数组的方法...
  5. python创意编程比赛-报名了!2019年全国青少年创意编程与智能设计大赛报名开始了...
  6. python.freelycode.com-每一个人都需要的Python类库
  7. python编程题-python编程题库
  8. python输入完怎么运行-教你如何编写、保存与运行Python程序的方法
  9. python代码画简单图-Python figure参数及subplot子图绘制代码
  10. 用python画简单的动物-如何用python画简单的动物