本节我们讲述一下ngx_buf.h头文件,其主要是定义了nginx buf缓冲区结构及相关的操作声明。
1 ngx_buf_s数据结构
-
pos: 当buf指向的数据在内存中的时候,pos指向的是这段数据的开始位置
-
last: 当buf指向的数据在内存中的时候, pos指向的是这段数据的结束位置
-
file_pos: 当buf指向的数据是在文件中的时候,file_pos指向的是这段数据的开始位置在文件中的偏移量
-
file_last: 当buf指向的数据是在文件中的时候,file_last执行的是这段数据的结束位置在文件中的偏移量
-
start: 当buf指向的数据是在内存里的时候,这一整块内存所包含的内容可能被包含在多个buf中(比如某段数据中间插入了其他数据,这一块数据就需要被拆分开),那么这些buf中的start和end都指向这一块内存的开始地址和结束地址。而pos和last指向没buf所实际包含的数据的开始和结尾。
-
end: 解释参见start.
-
tag: 实际上是一个void *类型的指针,使用者可以关联任意的对象上去,只要对使用者有意义
-
file: 当buf所包含的内容在文件时,file字段指向对应的文件对象
-
shadow: 当这个buf完整copy了另外一个buf的所有字段的时候,那么这两个buf实际指向的是同一块内存,或是同一个文件的同一部分,此时这两个buf的shadow字段都是指向对方的。那么对于这样的两个buf,在释放的时候,就需要使用者特别小心,具体由哪里释放,要提前考虑好,如果造成资源的多次释放,可能造成程序崩溃。使用shadow主要是为了节约内存,因为当有多个地方要操作这一块内存的时候,就可以新建一个shadow,对shadow的操作(这里并不修改所指向内存块的内容)不会影响到原buf。
-
temporary: 为1时表示该buf所包含的内容是在一个用户创建的内存块中,并且可以被在filter处理的过程中进行变更,而不会造成问题
-
memory: 为1时表示该buf所包含的内容是在内存中,但是这些内容却不能被进行处理的filter进行变更
-
mmap: 为1时表示该buf所包含的内容是在内存中,是通过mmap()使用内存映射从文件映射到内存中的,这些内容却不能被进行处理的filter进行变更。
-
recycled: 可以回收的。也就是这个buf是可以被释放的。这个字段通常是配合shadow字段一起使用的,对于使用ngx_create_temp_buf()函数所创建的buf,并且是另外一个buf的shadow,那么使用这个字段来标示这个buf是可以释放的。
-
in_file: 为1时表示该buf所包含的内容是在文件中
-
flush: 遇到有flush字段被设置为1的buf chain,则该chain的数据即便不是最后结束的数据(last_buf被设置,标示所有要输出的内容都完了),也会进行输出,不会受postpone_output配置的限制,但是会受到发送速率等其他条件的限制。
-
sync: 为1时表示可以对该buf进行同步操作,容易引起堵塞
-
last_buf: 数据被以多个chain传递给了过滤器,此字段为1表示这是缓冲区链表ngx_chain_t上最后一块待处理的缓冲区
-
last_in_chain: 在当前的chain里面,此buf是最后一个。特别要注意的是标志为last_in_chain的buf并不一定是last_buf,但是标志为last_buf的buf则一定是last_in_chain的。这是因为数据会被以多个chain传递给某个filter模块。
-
last_shadow: 在创建一个buf的shadow的时候,通常将新创建的一个buf的last_shadow置为1,表示为最后一个影子缓冲区。
-
temp_file: 由于受内存使用的限制,有时候一些buf的内容需要被写到磁盘上的临时文件中去,那么这时就设置此标志。
2. ngx_chain_s数据结构
ngx_chain_s
数据结构形成一个nginx buf链。ngx_bufs_t
数据结构一般在创建buf链的时候使用: num表明当前的buf数目; size表明每一个buf的空间大小。
3. ngx_output_chain_ctx_s数据结构
ngx_output_chain_ctx_s
数据结构主要用在ngx_output_chain()函数中,该函数主要用在http upstream模块及http copy filter模块。函数的主要目的就是发送一个buf chain(缓冲链)数据,而ngx_output_chain_ctx_s就用于保存发送的上下文,因此可以说该结构主要用于管理输出buf。
下面我们来简要介绍一下ngx_output_chain_ctx_s
结构的各字段:
-
buf: 这个域就是我们拷贝数据的地方,我们一般输出的话都是从in
(参看如下)直接copy相应的size大小的数据到buf中。一般作为发送时临时缓存使用
-
in: 这个就是我们保存那些需要发送数据的地方
-
free: 这个保存了一些空闲的buf,也就是说如果free存在,我们都会直接从free中取buf到前面的buf域。
-
busy: 表示马上就要发送的chain。
-
sendfile: 用于指定是否使用sendfile
-
directio: 是否使用directio
-
unaligned: 表明当前数据有没对齐
-
need_in_memory: 是否需要当前的数据处于内存中(使用sendfile的话,内存中没有文件拷贝,而我们有时需要处理文件,此时就需要设置这个标记)
-
need_in_temp: 表明数据是否需要在用户创建的一个临时内存中(这就使得可以对这一部分数据进行变更)
对于NGX_HAVE_FILE_AIO及NGX_THREADS,当前我们并没有定义
3. ngx_chain_writer_ctx_t数据结构
ngx_chain_write_ctx_t
主要用于upstream模块中。
4. 相关宏定义
如下我们简单解释一下各宏定义用途:
5. 相关函数声明
本部分主要是相关函数的声明:
[参看]:
-
Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c
-
Nginx基本数据结构之ngx_buf_t
-
Nginx关键数据结构分析(一) ngx_buf_t
-
Nginx filter分析
-
Nginx开发从入门到精通
-
结合源码看nginx-1.4.0之nginx内存管理详解
-
nginx的内存管理
-
ngx_output_chain 函数分析