闲不下来-nginx 链表结构
ngx_list_t 是 Nginx 封装的链表容器,链表容器内存分配是基于内存池进行的,操作方便,效率高。Nginx 链表容器和普通链表类似,均有链表表头和链表节点,通过节点指针组成链表。其在文件core/ngx_list.h
中结构定义如下:
链表结构
1 | c复制代码typedef struct ngx_list_part_s ngx_list_part_t; |
所以,了解 nginx 再次封装的基本结构,可以画个示意图,这样会方便理解。
链表方法
Nginx 链表的操作只有两个:创建链表 和 添加元素。由于链表的内存分配是基于内存池,所有内存的销毁由内存池进行,即链表没有销毁操作。
创建链表
关于源文件可去core/ngx_list.c
中,本文源文件的版本是 0.5
1 | c复制代码ngx_list_t * |
添加元素
1 | c复制代码void * |
添加元素到链表时,都是从最后一个节点开始,其过程:
- 首先判断最后一个节点的数据区是否由内存存放新增加的元素;
- 若足以存储该新元素,则返回存储新元素内存的位置;
- 若没有足够的内存存储新增加的元素,则分配一个新的节点,再把该新的节点连接到现有链表中,并返回存储新元素内存的位置。
此处链表与数组的区别:
- 数组数据区满时要扩充数据区空间;而链表每次要分配节点及其数据区。
- 添加的元素可以是整数,也可以是一个结构。
测试程序
1 | c复制代码#include "ngx_config.h" |
编写本例子的 Makefile:
1 | bash复制代码CXX = gcc |
运行结果:
1 | bash复制代码↳ ./ngx_list_t_test 00:24:13 |
参考
本文转载自: 掘金