Nginx的HTTP模块介绍-----数据结构部分

1.整型的封装

typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;


2. 字符串的封装

typedef struct{
	size_t len;
	u_char *data;
} ngx_str_t;

ngx_str_t只有两个成员,data指向字符串起始地址,len表示字符串的有效长度。C语言中,字符串一般都是以'\0'结尾,但是这里data指向的并不一定会以'\0'结尾,所以通过len,避免越界。


3.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;
}

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 是Nginx封装的链表容器。ngx_list_part_t是一个数组,拥有连续的内存,而ngx_list_t可以看成是元素为数组的链表。


ngx_list_t成员的意义:

1.last:指向链表的最后一个数组元素;

2.part:链表的首个数组元素;

3.size:限制每一个数组元素的大小;

4.nalloc:表示每个ngx_list_part_t数组的元素个数;

5.pool链表中管理内存分配的内存池对象


ngx_list_part_t成员,由上面的介绍,可以看出来,每个ngx_list_part_t的容量由size和nalloc来确定

1.elts:指向数组的起始地址;

2.nelts:表示数组中已经使用了多少个元素;

3.next:下一个ngx_list_part_t的地址


4.ngx_table_elt_t 数据结构

typedef struct {
	ngx_uint_t 		hash;
	ngx_str_t		key;
	ngx_str_t		value;
	u_char			*lowcase_key;
}ngx_table_elt_t;


ngx_table_elt_t 有点类似于一个key/value的存储结构,key、value成员里面都存放的是字符串,lowcase_key指向的是全小写的key字符串。ngx_table_elt_t一般用来存放HTTP头部,HTTP头部经常是大小写不敏感的,所以有了全小写的lowcase_key。因为ngx_table_elt_t可以是某个散列表数据结构(ngx_hash_t类型)中的成员,所以hash成员可以在ngx_hash_t更快的找到相同key的ngx_table_elt_t数据。


5.ngx_buf_t 数据结构

缓冲区ngx_buf_t是Nginx处理大数据的关键数据结构,既应用于内存数据也应用于磁盘数据。

typedef struct ngx_buf_s 	ngx_buf_t;
typedef struct void * 		ngx_buf_tag_t;
struct ngx_buf_s{
	//本次处理内存中的数据应该从pos这个位置开始
	u_char				*pos;
	//last 表示有效内容到此为止
	u_char				*last;
	//处理文件时,与pos,last
	off_t				file_pos;
	off_t				file_last;

	//如果缓存区用于内存,那么start指向这段内存起始地址,end指向这段内存结束地址
	u_char				*start;
	u_char				*end;
	
	//表示当前缓冲区的类型,由哪个模块使用就指向这个模块ngx_module_t变量的地址
	ngx_buf_tag_t		tag;
	
	//引用的文件
	ngx_file_t			*file;
	
	//影子缓存区,使用缓存区转发上游服务器的响应时才使用shadow
	ngx_buf_t			*shadow;
	
	//标志位,为1时,表示数据在内存中,且可以修改
	unsigned			temporary:1;
	//标志位,为1时,表示数据在内存中,且不可以修改
	unsigned			memory:1;
	//标志位,为1时,表示这段内存是用mmap系统调用映射过来的
	unsigned			mmap:1;
	//标志位,为1时,表示可回收
	unsigned			reclcled:1;
	//标志位,为1时,表示这段缓存区处理的是文件而不是内存
	unsigned			in_file:1;
	//标志位,为1时,表示需要执行flush操作
	unsigned			flush:1;
	//标志位,对于这块缓冲区时,是否使用同步方式,Nginx中的操作几乎都是异步的,这是Nginx支持高并发的关键
	unsigned			sync:1;
	//标志位,表示是否是最后一块缓冲区,因为ngx_buf_t可以由ngx_chain_t链表串联起来,
	//为1时,表示是最后一块待处理的缓冲区
	unsigned			last_buf:1;
	//标志位,表示是否是ngx_chain_t中的最后一块缓冲区
	unsigned			last_in_chain:1;
	//标志位,表示是否是最后一个影子缓冲区,与shadow域配合使用
	unsigned			last_shadow:1;
	//标志位,表示当前缓冲区是否属于临时文件
	unsigned			temp_file:1;
};

6.ngx_chain_t数据结构

typedef struct ngx_chain_s		ngx_chain_t;
struct ngx_chain_s {
	ngx_buf_t		*buf;
	ngx_chain_t		*next;
};

buf指向当前的ngx_buf_t缓冲区,next指向下一个ngx_chain_t。


关于HTTP模块先介绍到这,主要是一些数据结构的介绍,后面会再对Nginx HTTP模块处理进行介绍。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值