本文是读《深入理解Nginx》的笔记.
版本是基于1.0.4
因为Nginx中的数据结构比较基础也比较重要,是了解nginx最最开始的根本.
按照书中的思路分为两种:一种是相对基础一些的数据结构,一种是相对高级的数据结构
部分数据结构,未完
基础数据结构
ngx_int_t
Linux平台下:
typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;
请注意一下intptr_t与uintptr_t是一个根据64位或者32位操作系统去变化大小.
因此也可以用于去存储一个指针(名字中带有ptr意为pointer);.
ngx_str_t
用于存储字符串的类型
typedef struct {
size_t len;
u_char *data;//u_char为1字节类型
} ngx_str_t;
其中data指向字符串的起始地址.冷表示字符串的有效长度.
在这里要说一下,字符串的定义的思想在PHP中的字符串也是类似这么定义的,只不过是存储的类型有略微的差异.
为什么不用普通的char * 存储字符串:
1.\0不能被正确输出,C语言当中的字符串遇到\0就会认为结束,所以需要len去标实际长度.
2.复用字符串时,根据len的长度,以及data的首地址访问字符串,节省内存分配.
输出字符串时,按照u_char每一字节输出.
ngx_list_t
nginx将链表分为两个部分进行设计,ngx_list_t为总体部分,ngx_list_part_t位单个元素部分.
设计思想:将链表(ngx_list_t)当中的每个元素(ngx_list_part_t)进行细化成一个数组,每个数组的大小为size,nalloc个数组元素.
动态布局,当链表当中的每个元素空间(根据nelts判断)满后,申请一个新的元素添加到链表当中.
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;
}
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:
part:链表的首个元素
last:链表的最后一个元素
size:是指每个数组元素(不是元素)所存储的字节数.
nalloc:是每个元素最多容纳数组元素的个数.
pool:内存池对象.
ngx_list_part_t:
elts:存储的数组的首地址,可见链表类型可以存储任意类型的数据(是指elts所指的地址是nalloc数组每个元素的大小为size的数组).
nelts:表示数组当中已经使用了多少个元素.
next:指向下一个ngx_list_part_t.
链表的内存结构是连续的,包括elts也是连续的,由ngx_pool_t进行分配.
初始化函数:
ngx_list_create()
添加元素函数,若添加成功返回元素的首地址
ngx_list_push()