[筆記] 解碼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方向為降序。
相關文章
- laravel原始碼分析-佇列QueueLaravel原始碼佇列
- Team Queue(佇列)佇列
- JDK QUEUE佇列JDK佇列
- python佇列QueuePython佇列
- C# 佇列(Queue)C#佇列
- 佇列(Queue)-c實現佇列
- huawei0821筆試第二題筆記:雙端佇列deque筆試筆記佇列
- 資料結構之佇列(Queue)資料結構佇列
- js資料結構--佇列(queue)JS資料結構佇列
- java Queue佇列相關總結Java佇列
- 單調佇列雙端佇列佇列
- 原始碼解析Synchronous Queue 這種特立獨行的佇列原始碼佇列
- 雙端佇列佇列
- Python內建資料結構之雙向佇列Python資料結構佇列
- python的queue佇列獲取資料Python佇列
- Team Queue (佇列的一種應用)佇列
- Throwing cards away I(queue迴圈佇列)佇列
- 資料結構筆記——佇列資料結構筆記佇列
- 看動畫學演算法之:雙向佇列dequeue動畫演算法佇列
- C++ STL 優先佇列 (priority_queue)C++佇列
- 【資料結構】棧(Stack)和佇列(Queue)資料結構佇列
- java集合類——Stack棧類與Queue佇列Java佇列
- ArrayDeque(JDK雙端佇列)原始碼深度剖析JDK佇列原始碼
- Laravel 佇列 --- database 驅動(今天剛學習了佇列,記錄下筆記)Laravel佇列Database筆記
- Python教程:Python內建資料結構之雙向佇列!Python資料結構佇列
- 單向鏈式佇列佇列
- 看動畫學演算法之:佇列queue動畫演算法佇列
- Python學習筆記 - queuePython筆記
- Python技術分享:內建資料結構之雙向佇列Python資料結構佇列
- Python培訓:Python內建資料結構之雙向佇列Python資料結構佇列
- LVGL雙向連結串列學習筆記筆記
- 圖解--佇列、併發佇列圖解佇列
- 分散式任務 + 訊息佇列框架 go-queue分散式佇列框架Go
- 佇列_單向連結串列佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- RabbitMQ 學習筆記 -- 12 死信佇列 DLX + TTL 方式實現延遲佇列MQ筆記佇列
- Python培訓教程:Python內建資料結構之雙向佇列Python資料結構佇列
- 2.1資料結構學習筆記--佇列資料結構筆記佇列
- 【筆記/模板】無向圖的雙連通分量筆記