ngx_array_t
實現檔案: ./src/core/ngx_array.h ./src/core/ngx_array.c
1. 資料結構定義
typedef struct ngx_array_t;
單純的從結構定義可以看出, 陣列是與記憶體池繫結的, 占用的空間由記憶體池分配
2. 陣列操作
1.)建立
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
2.) 初始化
static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size);
3.) 銷毀
void ngx_array_destroy(ngx_array_t *a);
4.) 加入元素
void *ngx_array_push(ngx_array_t *a);
5.) 加入n個相同元素
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);
3. 操作詳解
關於陣列的操作, 大多簡單. 只拿出幾個談談
先看的當然是陣列的建立函式, 但是它就是簡單的記憶體分配以及變數初始化, 這裡就不貼出來了
下面是陣列的銷毀動作, 主要就是修改了記憶體池的last指標, 並沒有呼叫free等釋放記憶體的操作,顯然,這種維護效率是很高的。
void
ngx_array_destroy(ngx_array_t *a)
if ((u_char *) a + sizeof(ngx_array_t) == p->d.last)
}
最後, 看看如何新增乙個陣列元素
根據之前學習stl的經驗, 如果當前元素超過了最大元素個數, 那麼就會重新分配一段記憶體給這個陣列
void *
ngx_array_push(ngx_array_t *a)
else
//將原來的元素都複製過來
ngx_memcpy(new, a->elts, size);
a->elts = new;
a->nalloc *= 2;}}
//將新元素需要的記憶體返回
elt = (u_char *) a->elts + a->size * a->nelts;
a->nelts++;
return elt;
}
ngx_list_t
鍊錶是nginx封裝的鍊錶容器, 它在nginx中使用的非常頻繁.
相比較libevent中的tailq佇列, nginx中的list理解起來要容易的多
下面就簡單的認識一下這個鍊錶.
1. 資料結構的定義
typedef struct ngx_list_part_s ngx_list_part_t;
struct ngx_list_part_s ;
typedef struct ngx_list_t;
ngx_list_t描述整個鍊錶, 而ngx_list_part_t只描述鍊錶的乙個元素.
要注意的是, ngx_list_t不是乙個單純的鍊錶, 它是儲存陣列的鍊錶, 即每個鍊錶元素ngx_list_part_t是乙個陣列, 擁有連續的記憶體
該陣列既依賴ngx_list_t結構中的size和nalloc來表示陣列的容量, 同時又依靠每個ngx_list_part_t成員中的nelts來表示當前已經使用了多少容量.
對於這樣的設計, 有什麼好處呢?
1. 鍊錶中儲存的元素是靈活的, 可以是任何一種資料結構
2. 鍊錶元素需要占用的記憶體由ngx_list_t管理, 它已經通過陣列分配好了
3. 小塊的記憶體使用鍊錶訪問是低效率的, 使用陣列偏移來訪問則高效的多
2. 鍊錶的操作
ngx_list_t *
ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size)
if (ngx_list_init(list, pool, n, size) != ngx_ok)
return list;
}
在ngx_list_init中, 不僅初始化了一些變數, 還分配了 n*size 大小記憶體的乙個陣列. 說明最初建立的list會自帶乙個陣列元素
除了初始化, 還有乙個要看的就是插入元素了
既然鍊錶的每個元素是陣列, 那麼新值插入的位置就是最後乙個陣列元素的末尾, 或是另開乙個鍊錶元素來裝這個值
void *
ngx_list_push(ngx_list_t *l)
last->elts = ngx_palloc(l->pool, l->nalloc * l->size);
if (last->elts == null)
last->nelts = 0;
last->next = null;
//新的陣列元素放在鍊錶的末尾
l->last->next = last;
l->last = last;
}//返回新值要插入的空間起始位址
elt = (char *) last->elts + l->size * last->nelts;
last->nelts++;
return elt;
}
Nginx 一 nginx基礎介紹
toc 文章目錄 一款高效能 輕量級web服務軟體 nginx engine x 是乙個可以作為http web伺服器 反向 伺服器 郵件 伺服器和乙個通用的tcp udp 伺服器 1.9.0版本後 的多功能架構元件,同時也可以提供一定的快取服務功能 1 乙個master程序生成多個worker子程...
nginx安裝與配置 基礎
nginx官網右側download pre built packages欄目中點stable and mainline 改 etc yum.repos.d nginx.repo nginx stable name nginx stable repo baseurl gpgcheck 1 enable...
Nginx 3 Nginx基礎命令
nginx h 檢視有哪些可用的選項 nginx 檢視有哪些可用的選項 nginx v 檢視nginx版本資訊 nginx v 檢視當前nginx的編譯資訊 nginx t 或者 t 測試nginx.conf配置檔案是否存在錯誤 nginx s 向正在執行的nginx程序傳送訊號 quit訊號 與s...