Nginx基礎 Nginx陣列與鍊錶

2021-07-04 22:12:52 字數 2976 閱讀 3721

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...