ngx_array_t是nginx內部使用的數組結構。nginx的數組結構在存儲上與大家認知的C語言內置的數組有相似性,比如實際上存儲數據的區域也是一大塊連續的內存。但是數組除了存儲數據的內存以外還包含一些元信息來描述相關的一些信息。下面我們從數組的定義上來詳細的了解一下。ngx_array_t的定義位于src/core/ngx_array.c|h里面。
[](http:// "點擊提交Issue,反饋你的意見...")
typedef struct ngx_array_s ngx_array_t;
struct ngx_array_s {
void *elts;
ngx_uint_t nelts;
size_t size;
ngx_uint_t nalloc;
ngx_pool_t *pool;
};
| elts: | 指向實際的數據存儲區域。 |
|-----|-----|
| nelts: | 數組實際元素個數。 |
| size: | 數組單個元素的大小,單位是字節。 |
| nalloc: | 數組的容量。表示該數組在不引發擴容的前提下,可以最多存儲的元素的個數。當nelts增長到達nalloc 時,如果再往此數組中存儲元素,則會引發數組的擴容。數組的容量將會擴展到原有容量的2倍大小。實際上是分配新的一塊內存,新的一塊內存的大小是原有內存大小的2倍。原有的數據會被拷貝到新的一塊內存中。 |
| pool: | 該數組用來分配內存的內存池。 |
下面介紹ngx_array_t相關操作函數。
[](http:// "點擊提交Issue,反饋你的意見...")
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
創建一個新的數組對象,并返回這個對象。
| p: | 數組分配內存使用的內存池; |
|-----|-----|
| n: | 數組的初始容量大小,即在不擴容的情況下最多可以容納的元素個數。 |
| size: | 單個元素的大小,單位是字節。 |
[](http:// "點擊提交Issue,反饋你的意見...")
void ngx_array_destroy(ngx_array_t *a);
銷毀該數組對象,并釋放其分配的內存回內存池。
[](http:// "點擊提交Issue,反饋你的意見...")
void *ngx_array_push(ngx_array_t *a);
在數組a上新追加一個元素,并返回指向新元素的指針。需要把返回的指針使用類型轉換,轉換為具體的類型,然后再給新元素本身或者是各字段(如果數組的元素是復雜類型)賦值。
[](http:// "點擊提交Issue,反饋你的意見...")
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);
在數組a上追加n個元素,并返回指向這些追加元素的首個元素的位置的指針。
[](http:// "點擊提交Issue,反饋你的意見...")
static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size);
如果一個數組對象是被分配在堆上的,那么當調用ngx_array_destroy銷毀以后,如果想再次使用,就可以調用此函數。
如果一個數組對象是被分配在棧上的,那么就需要調用此函數,進行初始化的工作以后,才可以使用。
**注意事項:**?由于使用ngx_palloc分配內存,數組在擴容時,舊的內存不會被釋放,會造成內存的浪費。因此,最好能提前規劃好數組的容量,在創建或者初始化的時候一次搞定,避免多次擴容,造成內存浪費。
- 上篇:nginx模塊開發篇
- nginx平臺初探
- 初探nginx架構
- nginx基礎概念
- connection
- request
- keepalive
- pipe
- lingering_close
- 基本數據結構
- ngx_str_t
- ngx_pool_t
- ngx_array_t
- ngx_hash_t
- ngx_hash_wildcard_t
- ngx_hash_combined_t
- ngx_hash_keys_arrays_t
- ngx_chain_t
- ngx_buf_t
- ngx_list_t
- ngx_queue_t
- nginx的配置系統
- 指令參數
- 指令上下文
- nginx的模塊化體系結構
- 模塊的分類
- nginx的請求處理
- handler模塊
- handler模塊簡介
- 模塊的基本結構
- 模塊配置結構
- 模塊配置指令
- 模塊上下文結構
- 模塊的定義
- handler模塊的基本結構
- handler模塊的掛載
- handler的編寫步驟
- 示例: hello handler 模塊
- handler模塊的編譯和使用
- 更多handler模塊示例分析
- http access module
- http static module
- http log module
- 過濾模塊
- 過濾模塊簡介
- 過濾模塊的分析
- upstream模塊
- upstream模塊
- upstream模塊接口
- memcached模塊分析
- 本節回顧
- 負載均衡模塊
- 配置
- 指令
- 鉤子
- 初始化配置
- 初始化請求
- peer.get和peer.free回調函數
- 本節回顧
- 其他模塊
- core模塊
- event模塊
- 模塊開發高級篇
- 變量
- 下篇:nginx原理解析篇
- nginx架構詳解
- nginx的源碼目錄結構
- nginx的configure原理
- 模塊編譯順序
- nginx基礎設施
- 內存池
- nginx的啟動階段
- 概述
- 共有流程
- 配置解析
- nginx的請求處理階段
- 接收請求流程
- http請求格式簡介
- 請求頭讀取
- 解析請求行
- 解析請求頭
- 請求體讀取
- 讀取請求體
- 丟棄請求體
- 多階段處理請求
- 多階段執行鏈
- POST_READ階段
- SERVER_REWRITE階段
- FIND_CONFIG階段
- REWRITE階段
- POST_REWRITE階段
- PREACCESS階段
- ACCESS階段
- POST_ACCESS階段
- TRY_FILES階段
- CONTENT階段
- LOG階段
- Nginx filter
- header filter分析
- body filter分析
- ngx_http_copy_filter_module分析
- ngx_http_write_filter_module分析
- subrequest原理解析
- https請求處理解析
- 附錄A 編碼風格
- 附錄B 常用API
- 附錄C 模塊編譯,調試與測試