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; |