[筆記] 解碼Nginx:雙向佇列(Queue)
解碼Nginx:雙向佇列(Queue)
樑濤(@無鋒之刃)
2012-12-08
nginx-1.2.5
原始碼檔案
src/core/ngx_queue.h
src/core/ngx_queue.c
設計思路
Nginx提供一個非常簡單的侵入式雙向佇列(雙向連結串列),也即向每個元素嵌入資料結構的連結結點。這樣做的好處在於:
1. 省去對資料結構所用記憶體的管理,進一步減少記憶體碎片;
2. 降低程式碼複雜度。
另外,通過使用額外的哨兵結點機制,簡化了程式碼。
資料結構
/--------------------------------------------------------------------\
| |
| ngx_http_location_queue_t ngx_http_location_queue_t |
| +-----------------------+ +-----------------------+ |
| | ngx_queue_t queue | | ngx_queue_t queue | |
| /--+> +--------------------+ <-\ /---+> +--------------------+ <-/
\--|--+- | prev | \--|---+- | prev |
| | +--------------------+ | | +--------------------+
| | | next | -----/ | | next | --\
| +--+--------------------+ +--+--------------------+ |
| | ... | | ... | |
| | | | | |
| | | | | |
| +-----------------------+ +-----------------------+ |
| |
\-----------------------------------------------------------------/
注意點:
1. 圖中最左邊的queue即為哨兵結點。
介面函式
以h結點為哨兵的佇列稱之為h佇列。
雙向佇列的各個操作都很簡單,函式名即操作意圖:
1. ngx_queue_init(q)初始化哨兵結點,令prev欄位和next欄位均指向其自身;
2. ngx_queue_empty(q)檢查哨兵結點的prev欄位是否指向其自身,以判斷佇列是否為空;
3. ngx_queue_insert_head(h, x)在哨兵結點和第一個結點之間插入新結點x;
4. ngx_queue_insert_after(h, x)是ngx_queue_insert_head的別名;
5. ngx_queue_insert_tail(h, x)在最後一個結點和哨兵結點之間插入新結點;
6. ngx_queue_head(h)獲取第一個結點;
7. ngx_queue_last(h)獲取最後一個結點;
8. ngx_queue_sentinel(h)獲取哨兵結點(即引數h);
9. ngx_queue_next(q)獲取下一個結點;
10. ngx_queue_prev(q)獲取上一個結點;
11. ngx_queue_remove(x)將結點x從佇列中移除;
12. ngx_queue_split(h, q, n)將h為哨兵結點的佇列中q結點開始到隊尾結點的整個鏈拆分、連結到空的n佇列中,h佇列中的剩餘結點組成新佇列;
13. ngx_queue_add(h, n)將n佇列中的所有結點按順序連結到h佇列末尾,n佇列清空;
14. ngx_queue_middle(queue)使用雙倍步進演算法尋找queue佇列的中間結點;
15. ngx_queue_sort(queue, cmd)使用插入排序演算法對queue佇列進行排序,完成後在next方向上為升序,prev方向為降序。
相關文章
- [筆記] 解碼Nginx:陣列(Array)筆記Nginx陣列
- laravel原始碼分析-佇列QueueLaravel原始碼佇列
- JDK QUEUE佇列JDK佇列
- Team Queue(佇列)佇列
- python佇列QueuePython佇列
- C# 佇列(Queue)C#佇列
- 佇列(Queue)-c實現佇列
- STL(十九)queue佇列容器佇列
- Python3 queue佇列模組詳解Python佇列
- jQuery佇列控制方法詳解queue()/dequeue()/clearQueue()jQuery佇列
- [筆記] 解碼Nginx:列表(List)筆記Nginx
- huawei0821筆試第二題筆記:雙端佇列deque筆試筆記佇列
- 單調佇列雙端佇列佇列
- 資料結構之佇列(Queue)資料結構佇列
- java Queue佇列相關總結Java佇列
- js資料結構--佇列(queue)JS資料結構佇列
- 雙端佇列佇列
- 看動畫學演算法之:雙向佇列dequeue動畫演算法佇列
- 原始碼解析Synchronous Queue 這種特立獨行的佇列原始碼佇列
- Team Queue (佇列的一種應用)佇列
- POJ 2259 Team Queue【模擬佇列】佇列
- 29_檢查點佇列(checkpoint queue)佇列
- Python內建資料結構之雙向佇列Python資料結構佇列
- 資料結構筆記——佇列資料結構筆記佇列
- [筆記] 解碼Nginx:記憶體池(Memory Pool)筆記Nginx記憶體
- ArrayDeque(JDK雙端佇列)原始碼深度剖析JDK佇列原始碼
- java集合類——Stack棧類與Queue佇列Java佇列
- Throwing cards away I(queue迴圈佇列)佇列
- 【資料結構】棧(Stack)和佇列(Queue)資料結構佇列
- 看動畫學演算法之:佇列queue動畫演算法佇列
- STL(二十)priority_queue優先佇列容器佇列
- 訊息佇列(Message Queue)基本概念佇列
- python的queue佇列獲取資料Python佇列
- C++ STL 優先佇列 (priority_queue)C++佇列
- Laravel 佇列 --- database 驅動(今天剛學習了佇列,記錄下筆記)Laravel佇列Database筆記
- 單向鏈式佇列佇列
- 4_4雙棧佇列佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列