[筆記] 解碼Nginx:列表(List)
解碼Nginx:列表(List)
樑濤(@無鋒之刃)
2012-11-25
nginx-1.2.5
原始碼檔案
src/core/ngx_list.h
src/core/ngx_list.c
設計思路
Nginx實現的列表接近於陣列,但有三點區別:
- 可以在指定記憶體塊上建立列表資料結構;
- 儲備元素區中無空閒元素時,分配新的儲備元素區,掛到單向連結串列中,而不是替換掉舊的,在擴充容量的同時減少記憶體處理次數;
- 不提供ngx_list_destroy(),完全依靠底層記憶體池管理記憶體。
列表適用於元素較大、或元素生命週期較長,擴充儲備元素區會跨越記憶體池中多個ngx_pool_data_t結構體的場景。
資料結構
ngx_list_create(pool, n, size) ngx_list_push() ...
| |
+- ngx_palloc()---------\ +- ngx_palloc()--\
| | | |
\- ngx_palloc()----------------\ \- ngx_palloc()---------\
| | | |
ngx_list_t V | | |
+-----------------------+ | | |
| last | --\ | | |
+-----------------------+ | | | |
| ngx_list_part_t part | | | ngx_list_part_t V |
| +--------------------+ +--------> +------------------+ | /-> ...
/------+- | elts | | | /-- | elts | | |
| | +--------------------+ | | | +------------------+ | |
| | | netls | | | | | netls | --\ | |
| | +--------------------+ | | | +------------------+ | | |
| | | next | --/ | | | next | --------/
| +-----------------------+ | | +------------------+ | |
| /-- | size bytes | | | | |
| | +-----------------------+ | | | |
| | | nalloc = n | --\ | | | |
| | +-----------------------+ | | | | |
| | | pool | | | | | |
| | +-----------------------+ | | | | |
| | | | | | |
| | | | | | |
| | /------/ | /------/
| | | | | | |
| | V | | V |
\----> +-----------------------+ -+- \-> +------------------+ -+-
| | elem 0 | A | elem 5 | A
| / / | / / |
| / / | / / |
| | | | | | |
| +-----------------------+ | +------------------+ |
| | elem 1 | | | elem 6 | |
| / / | / / |
| / / | / / |
| | | | | | |
-+- +-----------------------+ | +------------------+ |
A | elem 2 | | | elem 7 | |
| / / | / / |
| / / | / / |
V | | | | | V
--- +-----------------------+ | +------------------+ ---
| elem 3 | | | unpushed |
/ / | / elements /
/ / | / /
| | | / /
+-----------------------+ | / /
/ elem 4 / | / /
/ / | / /
| | V | |
+-----------------------+ --- +------------------+
介面函式
ngx_list_create(pool, n, size)
ngx_list_create()負責動態建立一個列表,動作序列如下:
- 從pool中分配ngx_list_t結構體;
- 從pool中分配能容納n個size大小的元素的儲備元素區塊;
- 適當地初始化ngx_list_t結構體。
ngx_list_init(pool, n, size)
ngx_list_create()負責在給定的記憶體塊上建立一個列表,動作序列如下:
- 從pool中分配能容納n個size大小的元素的儲備元素區塊;
- 適當地初始化ngx_list_t結構體。
ngx_list_push(list)
ngx_list_push()負責向陣列中“壓入”一個元素(實際為取得一個空元素的首址),動作序列如下:
- 若列表中還有空元素,直接取得其首址並返回;
- 分配新的ngx_list_part_t結構體和儲備元素區塊,將結構體追加到列表單向連結串列尾部後分配新的空元素並返回。
相關文章
- [筆記] 解碼Nginx:陣列(Array)筆記Nginx陣列
- Python學習筆記:列表(list)基本內容Python筆記
- [筆記] 解碼Nginx:記憶體池(Memory Pool)筆記Nginx記憶體
- [筆記] 解碼Nginx:雙向佇列(Queue)筆記Nginx佇列
- Python零基礎學習筆記(十五)——list(列表)Python筆記
- list列表運算子,列表元素的遍歷,列表的方法,生成列表,巢狀的列表|python自學筆記(四)巢狀Python筆記
- nginx筆記Nginx筆記
- Python List 列表list()方法Python
- SCSS list 列表CSS
- Java筆記——【List、Set】Java筆記
- Python List 列表list()方法分享Python
- List簡易筆記一筆記
- python列表(List)Python
- Python 列表(List)Python
- Python list(列表)Python
- Nginx變數詳解(學習筆記十九)Nginx變數筆記
- python列表(list)和元組(tuple)詳解Python
- 【Nginx學習筆記】-初識NginxNginx筆記
- Nginx基礎筆記Nginx筆記
- Nginx 學習筆記Nginx筆記
- nginx學習筆記Nginx筆記
- React Native List列表React Native
- python--列表listPython
- Nginx原始碼完全註釋(3)ngx_list.h / ngx_list.cNginx原始碼
- 「學習筆記」迴圈、列表筆記
- python學習筆記——列表Python筆記
- 三,列表和陣列(筆記)陣列筆記
- Python中的List物件(《Python原始碼剖析》筆記四)Python物件原始碼筆記
- nginx 基礎命令筆記Nginx筆記
- Redis的列表型別(List)Redis型別
- Flutter學習筆記(12)--列表元件Flutter筆記元件
- React學習筆記-列表 & KeysReact筆記
- Python筆記-列表推導式Python筆記
- bootstrap學習筆記 Bootstrap 列表組boot筆記
- python學習筆記-list的用法Python筆記
- Python List 列表的處理Python
- Python - list 列表常見方法Python
- oracle list partition列表分割槽(一)Oracle