nginx----ngx_buf

原创 2015年07月10日 15:46:48

在ngx_buf.h文件中,定义了ngx_chain_t和ngx_buf_t两个结构体。其中chain起到一个链的作用,将待发送的数据包串联起来,而buf则是chain中的每一个节点。

ngx_buf_t的数据结构如下:

struct ngx_buf_s {
    u_char          *pos;
    u_char          *last;
    off_t            file_pos;
    off_t            file_last;

    u_char          *start;         /* start of buffer */
    u_char          *end;           /* end of buffer */
    ngx_buf_tag_t    tag;
    ngx_file_t      *file;
    ngx_buf_t       *shadow;


    /* the buf's content could be changed */
    unsigned         temporary:1;

    /*
     * the buf's content is in a memory cache or in a read only memory
     * and must not be changed
     */
    unsigned         memory:1;

    /* the buf's content is mmap()ed and must not be changed */
    unsigned         mmap:1;

    unsigned         recycled:1;
    unsigned         in_file:1;
    unsigned         flush:1;
    unsigned         sync:1;
    unsigned         last_buf:1;
    unsigned         last_in_chain:1;

    unsigned         last_shadow:1;
    unsigned         temp_file:1;

    /* STUB */ int   num;
};

buf结构体中的成员变量主要是用于指示数据存在的位置以及一些相关的标志位。

由上可知,buf用来指示chain中每个节点的实际数据的位置,实际数据可以存放在内存中,也可以存放在文件中。当在内存中时,用pos和last两个变量来指示数据存在的地址区间,当存在于文件中时,用file_pos和file_last来指示数据在文件中起始位置的偏移量。

ngx_chain_t的数据结构如下:

struct ngx_chain_s {
    ngx_buf_t    *buf;
    ngx_chain_t  *next;
};
chain通过next指针将多个buf 节点串联成链,然后等待一起发送。

一条ngx_chain的简单示意图如下,以数据存放在内存中为例:


由上图可知,一个数据包链是由多个ngx_chain通过next指针链接形成的,其中每一个chain节点都携带一个buf结构体,用于指示实际数据的位置。实际数据存放在内存块或文件中,最终形成的数据包链为上面的这种三级结构。

buf 一般都是从内存池中申请内存的,因此不同的buf中的数据可能存在于同一块内存块中,此时buf结构体中的start和end相同,但是通过pos和last变量来区分不同数据的起始位置。

当最后一个chain的next变量指向NULL时,数据包才会发送出去,否则将会一直遍历下去。

创建一条buf链

ngx_chain_t *
ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs)
{
    u_char       *p;
    ngx_int_t     i;
    ngx_buf_t    *b;
    ngx_chain_t  *chain, *cl, **ll;

    p = ngx_palloc(pool, bufs->num * bufs->size);   //从内存池中为分配buf指向的实际存储空间
    if (p == NULL) {
        return NULL;
    }

    ll = &chain;

    for (i = 0; i < bufs->num; i++) {

        b = ngx_calloc_buf(pool);  //为每一个buf 结构分配内存
        if (b == NULL) {
            return NULL;
        }

        b->pos = p;   //设置每一个buf 的每一个字段的值
        b->last = p;
        b->temporary = 1;

        b->start = p;
        p += bufs->size;
        b->end = p;

        cl = ngx_alloc_chain_link(pool);   //为chain中的每一个节点分配内存
        if (cl == NULL) {
            return NULL;
        }

        cl->buf = b;    //将chain节点和buf结构绑定到一起
        *ll = cl;       //将每一个chain节点通过next指针串联成一条链
        ll = &cl->next;
    }

    *ll = NULL;   //chain中最后一个节点的next指针指向NULL,表示一条链的结束

    return chain;
}
最终生成的结构示意图如下:



版权声明:本文为博主原创文章,未经博主允许不得转载。

Nginx基本数据结构之ngx_buf_t

这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据。该结构实际上是一种抽象的数据结构,它代表某种具体的数据。这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分...
  • wangpengqi
  • wangpengqi
  • 2013年12月10日 17:19
  • 3172

ngx_buf_t使用

3.7.2 将内存中的字符串作为包体发送 调用ngx_http_output_filter方法即可向客户端发送HTTP响应包体,下面查看一下此方法的原型,如下所示。 ngx_int_t...
  • yangguangmeng
  • yangguangmeng
  • 2014年06月17日 14:18
  • 1390

Nginx基本数据结构之ngx_buf_t

这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据。该结构实际上是一种抽象的数据结构,它代表某种具体的数据。这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分...
  • wangpengqi
  • wangpengqi
  • 2013年12月10日 17:19
  • 3172

Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c

Nginx的buf缓冲区数据结构,主要用来存储非常大块的内存。ngx_buf_t数据结构也贯穿了整个Nginx。 缓冲区ngx_buf_t是nginx处理大数据的关键数据结构,它既应用于内存数据也应用...
  • initphp
  • initphp
  • 2016年01月30日 13:32
  • 2425

Nginx在LAMP上的扩充

在原来搭建好LAMP的基础上安装nginx [root@localhost nginx-1.0.15]# yum install libxslt-devel [root@localhost ~...
  • quanliyadan
  • quanliyadan
  • 2013年10月17日 17:08
  • 1190

NGINX 时间管理机制

nginx 自己维护了一个时间,用户向用户提供时间,它使用缓存时间的机制,这样避免了频繁的系统调用(gettimeofday),降低时间消耗。但缓存时间,又必须要及时更新时间,否则时间将不准确。...
  • spch2008
  • spch2008
  • 2014年06月10日 10:26
  • 1312

nginx之共享内存

常用函数 ngx_shmtx_create() 创建 ngx_shmtx_destory() 销毁 ngx_shmtx_trylock() 尝试加锁(加锁失败则...
  • evsqiezi
  • evsqiezi
  • 2016年06月29日 18:34
  • 1004

nginx 过滤模块

http://tengine.taobao.org/book/chapter_04.html 过滤模块 (90%) 过滤模块简介 (90%) 执行时间和内容 (9...
  • guolong1983811
  • guolong1983811
  • 2016年12月13日 23:41
  • 302

使用fastcgi_cache加速你的Nginx网站

很久以前在TW上挖了个坑,说nginx的fastcgi_cache是被大家忽视的一大金矿,今天把这个坑填上。   对于变化不太频繁的数据,大家都比较喜欢存Memcached以减少数据库的读取,但还是...
  • moqiang02
  • moqiang02
  • 2014年07月14日 22:57
  • 821

NGX打印日志时对特殊字符的转码

问题: [root@3WR ~]# curl -svo /dev/null test/ -x 127.0.0.1:9711 日志打印结果不一致1.控制台输出结果 >User-Agent: curl...
  • OutManLee
  • OutManLee
  • 2015年07月01日 17:16
  • 1344
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nginx----ngx_buf
举报原因:
原因补充:

(最多只允许输入30个字)