nginx 缓冲区构造

来源:互联网 发布:家里有蚂蚁 知乎 编辑:程序博客网 时间:2024/05/29 00:31

nginx 缓冲区构造

from http://hi.baidu.com/langwan/blog/item/822b758d5d1d9a1ab31bbaf8.html

 

nginx 缓冲区构造
2009-05-07 21:55

和缓冲区有关的最基本的是三个结构:

ngx_buf_t、ngx_chain_t、ngx_bufs_t

分别代表 缓冲区、链表、缓冲区尺寸。

一块缓存区可以存放多段数据,因此在nginx中缓存结构被这样定义:

struct ngx_buf_s {
    u_char          *start; //缓冲区首部
    u_char          *end; //缓冲区尾部
    u_char          *pos; //当前指针所在位置
    u_char          *last; //有效数据的尾部
    ...
}

按照这种道理end永远不小于last,例如缓存区一共申请了10个单元,而目前只填充了6个单元,那么last为6,end为10。

为了区分是那种类型的缓冲,在这个结构中还有一些标识,例如:

ngx_file_t      *file; //文件结构指针
unsigned         memory:1; //是否在内存中
unsigned         mmap:1; //内存中的文件映射
unsigned         recycled:1; //被回收
unsigned         in_file:1; //文件缓冲
unsigned         flush:1; //被清除
unsigned         sync:1; //异步
unsigned         last_in_chain:1; //链表的尾部
unsigned         temp_file:1; //是否是临时文件中的缓冲

通过一个8位存储了一个缓冲区的8种状态,在C语言里这种方式比较经济节省。在高级语言里,是尝不到这种便宜的。

链表结构ngx_chain_t是单向链表结构。

ngx_http_upstream_s是nginx一个核心数据结构,用于负载均衡的实现。

目前 nginx只是五种路由方式,请参考下面的资料:

http://hi.baidu.com/farmerluo/blog/item/c68173f05a5950a8a40f5290.html

简单说是 轮询、按权重、按IP的固定hash、按url的固定hash、按响应时间等

在这个结构中使用了若干缓存有关的子结构,例如:

ngx_buf_t、ngx_chain_t、ngx_output_chain_ctx_t等,具体的结构有

    ngx_chain_t                    *out_bufs;
    ngx_chain_t                    *busy_bufs;
    ngx_chain_t                    *free_bufs;
ngx_chain_t                    *request_bufs;

因此一般的缓存会以单向链表的形式出现。

对于特定的缓存也会出现对应的缓存结构,例如:

typedef struct {
    ngx_buf_t                   *buf;
    ngx_chain_t                 *in;
    ngx_chain_t                 *free;
    ngx_chain_t                 *busy;

    unsigned                     sendfile;
    unsigned                     need_in_memory;
    unsigned                     need_in_temp;

    ngx_pool_t                  *pool;
    ngx_int_t                    allocated;
    ngx_bufs_t                   bufs;
    ngx_buf_tag_t                tag;

    ngx_output_chain_filter_pt   output_filter;
    void                        *filter_ctx;
} ngx_output_chain_ctx_t;

原创粉丝点击