首頁  >  文章  >  後端開發  >  nginx高階資料結構原始碼分析(一)-----雙向鍊錶

nginx高階資料結構原始碼分析(一)-----雙向鍊錶

WBOY
WBOY原創
2016-07-30 13:31:47982瀏覽

ng_queue_t是Nginx提供的一個順序容器,它以雙向鍊錶的方式將資料組織在一起。

鍊錶作為順序容器的優點在於,它可以高效的執行插入、刪除、合併等操作,在移動鍊錶中的元素時只需要修改指針的指向,因此,它很適合頻繁修改容器的場合。

相對於其他順序容器,它的優勢有以下三點:

 (1)  實現了排序功能,採用額是插入排序,雖然不太適合超大規模資料的排序,雖然不太適合但是簡單實用。

(2)  它非常輕量級,不負責鍊錶元素所佔記憶體的分配。 ngx_queue_t只是把這些分配號記憶體的元素用雙向鍊錶連結起來

(3)  支援兩個鍊錶的合併。

Nginx在設計這個雙向鍊錶時,由於容器與元素共用了ngx_queue_t結構體,為了避免此結構體成員的意義混亂,Nginx封裝了鍊錶容器與元素的所有方法。

ngx_queue_t的頭檔:

gx_queue_t的實作檔中只有兩個方法:一個是傳回鍊錶中的中心元素,還有一個是對鍊錶排序。

typedef struct ngx_queue_s  ngx_queue_t;

struct ngx_queue_s {
    ngx_queue_t  *prev;
    ngx_queue_t  *next;
};


#define ngx_queue_init(q)                                                     \初始化,为空,都指向容器结构体
    (q)->prev = q;                                                            \
    (q)->next = q


#define ngx_queue_empty(h)                                                    \是否为空
    (h == (h)->prev)


#define ngx_queue_insert_head(h, x)                                           \插入链表容器头部
    (x)->next = (h)->next;                                                    \
    (x)->next->prev = x;                                                      \
    (x)->prev = h;                                                            \
    (h)->next = x


#define ngx_queue_insert_after   ngx_queue_insert_head


#define ngx_queue_insert_tail(h, x)                                           \插入链表容器尾部
    (x)->prev = (h)->prev;                                                    \
    (x)->prev->next = x;                                                      \
    (x)->next = h;                                                            \
    (h)->prev = x


#define ngx_queue_head(h)                                                     \返回第一个结构体指针
    (h)->next


#define ngx_queue_last(h)                                                     \返回最后一个结构体指针
    (h)->prev


#define ngx_queue_sentinel(h)                                                 \返回容器结构体指针
    (h)


#define ngx_queue_next(q)                                                     \返回q的下一个元素
    (q)->next


#define ngx_queue_prev(q)                                                     \返回q的上一个元素
    (q)->prev


#if (NGX_DEBUG)

#define ngx_queue_remove(x)                                                   \
    (x)->next->prev = (x)->prev;                                              \
    (x)->prev->next = (x)->next;                                              \
    (x)->prev = NULL;                                                         \
    (x)->next = NULL

#else

#define ngx_queue_remove(x)                                                   \删除x
    (x)->next->prev = (x)->prev;                                              \
    (x)->prev->next = (x)->next

#endif


#define ngx_queue_split(h, q, n)                                              \拆分成两个链表
    (n)->prev = (h)->prev;                                                    \
    (n)->prev->next = n;                                                      \
    (n)->next = q;                                                            \
    (h)->prev = (q)->prev;                                                    \
    (h)->prev->next = h;                                                      \
    (q)->prev = n;


#define ngx_queue_add(h, n)                                                   \合并链表
    (h)->prev->next = (n)->next;                                              \
    (n)->next->prev = (h)->prev;                                              \
    (h)->prev = (n)->prev;                                                    \
    (h)->prev->next = h;


#define ngx_queue_data(q, type, link)                                         \返回q所属结构体地址
    (type *) ((u_char *) q - offsetof(type, link))
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。


以上就介紹了nginx高階資料結構原始碼分析(一)-----雙向鍊錶,包含了方面的內容,希望對PHP教學有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:php -> =>的問題下一篇:php -> =>的問題