twemproxy源码解析2

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/qq_25560423/article/details/88852618

在nc_mbuf.h里

struct mbuf {
    uint32_t           magic;   /* mbuf magic (const) 这个值不是很理解是什么意思,一般是0xdeadbeef*/
    STAILQ_ENTRY(mbuf) next;    /* next mbuf 下一块mbuf,代码里所有的mbuf几乎都是以单向链表的形式存储的*/
    uint8_t            *pos;    /* read marker 表示这块mbuf已经读到那个字节了*/
    uint8_t            *last;   /* write marker 表示这块mbuf已经写到哪个字节*/
    uint8_t            *start;  /* start of buffer (const) 表示这块mbuf的起始位置*/
    uint8_t            *end;    /* end of buffer (const) 表示这块mbuf的结束位置*/
};
STAILQ_HEAD(mhdr, mbuf);    /*mhdr是mbuf单向队列的队列头部*/

这里要对mbuf解释几句,这里涉及到nc_mbuf.c里的代码:

1.mbuf的每一块可以通过配置规定其大小 ,可以说每一块mbuf的大小都是一个固定值(16384),为此在生成时mbuf会去申请一个固定大小的内存,如果这个大小是mbuf_chunk_size,那么end = start + mbuf_chunk_size - sizeof(struct mbuf),为此start,end,以及magic都是定值。

2.mbuf在申请后一般不会被释放,在使用完后会被放入static struct mhdr free_mbufq这个队列中,一旦要使用mbuf时首先从free_mbufq中取出未使用的mbuf,如果这个队列为空时,它才会去向系统申请新的mbuf。

猜你喜欢

转载自blog.csdn.net/qq_25560423/article/details/88852618