[筆記] 解碼Nginx:陣列(Array)
解碼Nginx:陣列(Array)
樑濤(@無鋒之刃)
2012-11-24 ~ 2012-11-25
nginx-1.2.5
原始碼檔案
src/core/ngx_array.h
src/core/ngx_array.c
設計思路
陣列是非常常用的資料結構。為降低使用時的時間開銷,Nginx對陣列設計做了不少簡化:
- 使用從給定記憶體池中預分配好的儲備元素區塊;
- 儲備元素區塊無空閒元素供分配時,嘗試從原記憶體池中分配新的空閒元素,或擴充儲備元素區塊以完成分配;
- “分配”,或“壓入”,只是取得新的空閒元素的首址,不負責建立實際元素;
- “釋放”只是調整原記憶體池的欄位,不負責清理實際元素,或者乾脆推遲釋放時機;
- 使用者可以直接訪問陣列的各個欄位,以取得最佳效能。
陣列適用於元素較小、或元素生命週期較短,擴充儲備元素區不會跨越記憶體池中多個ngx_pool_data_t結構體的場景。
資料結構
ngx_array_create(pool, n, size) ngx_array_push()/ ...
| ngx_array_push_n()
| |
+- ngx_palloc()-----\ /---?- ngx_palloc()------\
| | | |
\- ngx_palloc()-------------------\ | |
| | | |
ngx_array_t V | | |
+-------------------+ | | |
/----- | elts | ======================\ |
| +-------------------+ | | H |
| | nelts | -------\ | | H |
| +-------------------+ | | | H |
| /-- | size bytes | | | | H |
| | +-------------------+ | | | H |
| | | nalloc = n | --\ | | | H |
| | +-------------------+ | | | | H |
| | | pool | | | | | H |
| | +-------------------+ | | | | H |
| | | | | | H |
| | | | | | H |
| | /-------------/ | H |
| | | | | | H |
| | | | | | H |
| | V | | | V V
\----> +-------------------+ -+- -+- | +-------------------+
| | elem 0 | A A | | elem 0 |
| / / | | | / /
| / / | | | / /
| | | | | | | |
| +-------------------+ | | | +-------------------+
| | elem 1 | | | | | elem 1 |
| / / | | | / /
| / / | | | / /
| | | | | | | |
-+- +-------------------+ | | | +-------------------+
A | elem 2 | | | | | elem 2 |
| / / | | | / /
| / / | | | / /
V | | | V | | |
--- +-------------------+ | --- | +-------------------+
| unpushed | | | | elem 3 |
/ elements / | | / /
/ / | | / /
/ / | | | |
/ / | | +-------------------|
/ / | | | elem 4 |
/ / | | / /
/ / | | / /
| | V | | |
+-------------------+ --- <----------/ +-------------------+
| extended | | elem 5 |
/ area / / /
/ (in place) / / /
/ / | /
/ / +-------------------|
/ / | unpushed |
/ / / elements /
/ / / /
| = size * n | | |
+-------------------+ +-------------------+
介面函式
ngx_array_create(pool, n, size)
ngx_array_create()負責動態建立一個陣列,動作序列如下:
- 從pool中分配ngx_array_t結構體;
- 從pool中分配能容納n個size大小的元素的儲備元素區塊;
- 適當地初始化ngx_array_t結構體。
ngx_array_destroy(array)
ngx_array_destroy()負責“釋放”陣列使用的記憶體塊(實際為推遲釋放時機),但不清理其中的各個元素。動作序列如下:
- 如果儲備元素區塊位於pool的末尾,直接移動pool->current->d.last指標,指向“釋放”後的地址;
- 如果ngx_array_t結構體位於pool的末尾,直接移動pool->current->d.lat指標,指向“釋放”後的地址;
- 否則什麼也不做。
ngx_array_push(array)/ngx_array_push_n(array, n)
ngx_array_push()負責向陣列中“壓入”一個元素(實際為取得一個空閒元素的首址),動作序列如下:
- 若陣列中還有空閒元素,直接取得其首址並返回;
- 若陣列的儲備元素區塊位於pool的儲備記憶體塊中最末位置,且其還有size大小的剩餘空間,則直接分配新的空閒元素並返回;
- 重新分配新的儲備元素區塊(原區塊的2倍大小)並複製已有元素,將新區塊首址存入elts欄位後分配新的空閒元素並返回。
ngx_array_push_n()與前者相似,可以一次返回n個新的空閒元素的切片首址。
相關文章
- [筆記] 解碼Nginx:雙向佇列(Queue)筆記Nginx佇列
- Array陣列陣列
- 陣列分割——解題筆記陣列筆記
- JavaScript Array 陣列JavaScript陣列
- [筆記] 解碼Nginx:列表(List)筆記Nginx
- JavaScript之陣列ArrayJavaScript陣列
- GO 筆記-陣列Go筆記陣列
- JS 陣列筆記JS陣列筆記
- 陣列筆記1陣列筆記
- 內建物件--Array(陣列)物件陣列
- 磁碟陣列(Disk array)原理陣列
- day05陣列array陣列
- Ruby 札記 - Ruby 集合家族之陣列(Array)陣列
- IOS筆記之陣列iOS筆記陣列
- JavaScript筆記(6)陣列JavaScript筆記陣列
- 【筆記】字尾陣列筆記陣列
- jQuery遍歷array陣列元素程式碼例項jQuery陣列
- 圖解:什麼是旋轉陣列(Rotate Array)?圖解陣列
- JavaScript中陣列Array.sort()排序方法詳解JavaScript陣列排序
- [筆記] 解碼Nginx:記憶體池(Memory Pool)筆記Nginx記憶體
- TPU &“脈動陣列”(systolic array)陣列
- 瞭解下C# 陣列(Array)C#陣列
- JavaScript刪除array陣列元素JavaScript陣列
- Knockout Observable Array(監控陣列)陣列
- Array-like類陣列物件陣列物件
- [CareerCup] 17.6 Sort Array 排列陣列陣列
- 磁碟陣列(Disk array)原理(轉)陣列
- C++ ——vector陣列筆記C++陣列筆記
- iOS筆記之陣列排序iOS筆記陣列排序
- JS陣列學習筆記JS陣列筆記
- 【筆記】oracle 陣列實現筆記Oracle陣列
- 三,列表和陣列(筆記)陣列筆記
- 【筆記/模板】樹狀陣列筆記陣列
- 陣列指標:a pointer to an array,即指向陣列的指標陣列指標
- 【Java學習筆記之五】java陣列詳解Java筆記陣列
- Java 學習筆記 二維陣列和物件陣列Java筆記陣列物件
- iOS 判斷陣列array中是否包含指定的元素,取出該元素在array中的下標+陣列方法詳解...iOS陣列
- Go 基礎教程--6 陣列 ArrayGo陣列