7.2 ngx_queue_t双向链表

ngx_queue_t是Nginx提供的一个基础顺序容器,它以双向链表的方式将数据组织在一起。在Nginx中,ngx_queue_t数据结构被大量使用,下面将详细介绍它的特点、用法。

7.2.1 为什么设计ngx_queue_t双向链表

链表作为顺序容器的优势在于,它可以高效地执行插入、删除、合并等操作,在移动链表中的元素时只需要修改指针的指向,因此,它很适合频繁修改容器的场合。在Nginx中,链表是必不可少的,而ngx_queue_t双向链表就被设计用于达成以上目的。

相对于Nginx其他顺序容器,ngx_queue_t容器的优势在于:

❑实现了排序功能。

❑它非常轻量级,是一个纯粹的双向链表。它不负责链表元素所占内存的分配,与Nginx封装的ngx_pool_t内存池完全无关。

❑支持两个链表间的合并。

ngx_queue_t容器的实现只用了一个数据结构ngx_queue_t,它仅有两个成员:prev、next,如下所示:


typedef struct ngx_queue_s ngx_queue_t;

struct ngx_queue_s{

ngx_queue_t*prev;

ngx_queue_t*next;

};


因此,对于链表中的每个元素来说,空间上只会增加两个指针的内存消耗。

使用ngx_queue_t时可能会遇到有些让人费解的情况,因为链表容器自身是使用ngx_queue_t来标识的,而链表中的每个元素同样使用ngx_queue_t结构来标识自己,并以ngx_queue_t结构维持其与相邻元素的关系。下面开始介绍ngx_queue_t的使用方法。