菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t

本文深入剖析了nginx源码中的关键数据结构——缓冲区链表ngx_chain_t,详细解释了其在nginx中如何组织和使用,帮助读者理解nginx内部的数据流转和处理机制。
摘要由CSDN通过智能技术生成

 

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t

 

  • Author:Echo Chen(陈斌)

  • Email:chenb19870707@gmail.com

  • Blog:Blog.csdn.net/chen19870707

  • Date:Nov 6th, 2014

     

    1.缓冲区链表结构ngx_chain_t和ngx_buf_t

    nginx的缓冲区链表如下图所示,ngx_chain_t为链表,ngx_buf_t为缓冲区结点:

    image

    2.源代码位置

     

    头文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_buf.h

    源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_buf.c

     

    3.数据结构定义

    ngx_buf_t为缓冲区结点,其定义如下:

       1: typedef struct ngx_buf_s    ngx_buf_t;
       2: typedef void  *ngx_buf_tag_t;
       3: struct ngx_buf_s {
        
       4:     /*
       5:      * pos通常是用来告诉使用者本次应该从pos这个位置开始处理内存中的数据,这样设置是因为同一个
       6:      * ngx_buf_t可能被多次反复处理。当然,pos的含义是由使用它的模板定义的
       7:      */
       8:     u_char  *pos;
       9:                                
      10:     /* last通常表示有效的内容到此为止,注意,pos与last之间的内存是希望nginx处理的内容 */
      11:     u_char  *last;
      12:                                
      13:     /*
      14:      * 处理文件时,file_pos与file_last的含义与处理内存时的pos与last相同,
      15:      * file_pos表示将要处理的文件位置,file_last表示截至的文件位置。
      16:      */
      17:     off_t   file_pos;
      18:     off_t   file_last;
      19:                                
      20:     /* 如果ngx_buf_t缓冲区用于内存,那么start指向这段内存的起始地址 */
      21:     u_char  *start;
      22:                                
      23:     /* 与start成员对应,指向缓冲区内存的末尾 */
      24:     u_char  *end;
      25:                                
      26:     /* 表示当前缓冲区的类型,例如由哪个模块使用就指向这个模块ngx_module_t变量的地址 */
      27:     ngx_buf_tag_t  tag;
      28:                                
      29:     /* 引用的文件 */
      30:     ngx_file_t  *file;
      31:                                
      32:     /*
      33:      * 当前缓冲区的影子缓冲区,该成员很少用到。当缓冲区转发上游服务器的响应时才使用了shadow成员,
      34:      * 这是因为nginx太节约内存了,分配一块内存并使用ngx_buf_t表示接收到的上游服务器响应后,
      35:      * 在向下游客户端转发时可能会把这块内存存储到文件中,也可能直接向下游发送,此时nginx绝对不会
      36:      * 重新复制一份内存用于新的目的,而是再次建立一个ngx_buf_t结构体指向原内存,这样多个ngx_buf_t
      37:      * 结构体指向了同一份内存,它们之间的关系就通过shadow成员来引用,一般不建议使用。
      38:      */
      39:     ngx_buf_t   *shadow;
      40:                                
      41:     /* 临时内存标志位,为1时表示数据在内存中且这段内存可以修改 */
      42:     unsigned    temporay:1;
      43:                                
      44:     /* 标志位,为1时表示数据在内存中且这段内存不可以修改 */
      45:     unsigned    memory:1;
      46:                                
      47:     /* 标志位,为1时表示这段内存是用nmap系统调用映射过来的,不可以修改 */
      48:     unsigned    mmap:1;
      49:                                
      50:     /* 标志位,为1时表示可回收 */
      51:     unsigned    recycled:1;
      52:                                
      53:     /* 标志位,为1时表示这段缓冲区处理的是文件而不是内存 */
      54:     unsigned    in_file:1;
      55:                                
      56:     /* 标志位,为1时表示需要执行flush操作 */
      57:     unsigned    flush:1;
      58:                                
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值