Nginx 基础数据结构
2016-06-13 13:47
363 查看
学习《深入理解Nginx模块开发与架构解析》的记录
可以看到,ngx_int_t实际上是intptr_t,而intptr_t的定义在/usr/include/stdint.h:
在64位机器上,intptr_t是long int,否则是int。
疑问:intptr_t从名字上是保存指针用的,实际上是long int 或 int?
节点定义:
节点中的数据域是一个指针(void *)指向一块连续的内存。这样链表中存放的元素没有固定的数据类型,很灵活。
链表定义:
根据这个内存分布图,可以知道链表的所有元素都由pool来分派,pool是一块连续的内存。因此遍历这个链表的方式是这样的:
用于表示HTTP头部信息。如key是Content-Length,value是1024。
整型
typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t;
可以看到,ngx_int_t实际上是intptr_t,而intptr_t的定义在/usr/include/stdint.h:
/* Types for `void *' pointers. */ #if __WORDSIZE == 64 # ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int uintptr_t; #endif
在64位机器上,intptr_t是long int,否则是int。
疑问:intptr_t从名字上是保存指针用的,实际上是long int 或 int?
字符串
typedef struct { size_t len; // 字符串不一定以\0结尾,因此需要len给出字符串长度 u_char *data; } ngx_str_t; typedef struct { ngx_str_t key; ngx_str_t value; } ngx_keyval_t; typedef struct { unsigned len:28; unsigned valid:1; unsigned no_cacheable:1; unsigned not_found:1; unsigned escape:1; u_char *data; } ngx_variable_value_t;
链表
ngx_list_t使用频繁,如HTTP头部就是用ngx_list_t存储的。节点定义:
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; // 下一个节点 };
节点中的数据域是一个指针(void *)指向一块连续的内存。这样链表中存放的元素没有固定的数据类型,很灵活。
链表定义:
typedef struct { ngx_list_part_t *last; // 指向最后一个节点 ngx_list_part_t part; // "指向"第一个节点 size_t size; // 每个节点中,一个数组元素占用空间的大小限制,即elts指向数组中每个元素的大小 ngx_uint_t nalloc;// 每个节点中数组的元素个数 ngx_pool_t *pool; // 内存池 } ngx_list_t;
根据这个内存分布图,可以知道链表的所有元素都由pool来分派,pool是一块连续的内存。因此遍历这个链表的方式是这样的:
/* * * the iteration through the list: * * part = &list.part; // part指向链表的第一个节点 * data = part->elts; // data指向该节点所指向的数组空间 * * for (i = 0 ;; i++) { // 访问数组中的每一个元素 * * if (i >= part->nelts) { // nelts表示数组中的元素个数,当达到它时,表示该节点中的所有元素已经遍历完 * if (part->next == NULL) { // 没有下一个节点元素,表示链表遍历完 * break; * } * * // 准备遍历链表中下一个节点中的数组 * part = part->next; * data = part->elts; * i = 0; * } * * // 访问一个数组元素 * ... data[i] ... * * } */
ngx_table_elt_t
// src/core/ngx_hash.h typedef struct { ngx_uint_t hash; ngx_str_t key; ngx_str_t value; u_char *lowcase_key; } ngx_table_elt_t;
用于表示HTTP头部信息。如key是Content-Length,value是1024。
相关文章推荐
- 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
- 数据结构第七次试验
- 数据结构(线段树):SPOJ GSS3 - Can you answer these queries III
- thrift数据结构
- 数据结构算法模拟系统
- 多余元素删除之移位算法
- UVA - 1395 - Slim Span(Kruskal算法+枚举)
- 数据结构之二叉树
- 算法导论 第10章 10.3 指针和对象实现
- 算法导论-15-3-编辑距离
- 第16章 贪心算法
- 算法导论 第22章 图算法 22.3 深度优先搜索
- 算法导论-14.3-6-MIN-GAP
- 算法导论 14.1-7 顺序统计树求逆序对 O(nlgn)
- 算法导论-15-4-计划一个公司聚会
- 算法导论-13-1-持久动态集合
- Linux2.6为数据结构分配内存-slab
- 算法导论-15-7-达到最高效益的调度
- 算法导论 第10章 10.4 有根树的表示
- 算法导论 第13章 红黑树