nginx中基礎資料結構的詳細說明

2021-07-25 02:58:49 字數 2613 閱讀 8156

nginx使用ngx_int_t封裝有符號整型,使用ngx_uint_t封裝無符號整型

ngx_int_t、ngx_uint_t的定義如下:

typedef intptr_t ngx_int_t; 

typedef uintptr_t ngx_uint_t;

ngx_str_t結構就是字串。ngx_str_t的定義如下:

typedef struct 

ngx_str_t;

ngx_str_t只有兩個成員,其中data指標指向字串起始位址,len表示字串的有效長度。

ngx_str_t的data成員指向的並不是普通的字串,因為這段字串未必會以'\0'作為結尾,所以使用時必須根據長度len來使用data成員

例如定義乙個ngx_test_str,判斷字串是否是「hello」時,需要執行如下:

ngx_str_t ngx_test_str;

if (0 == ngx_strncmp( ngx_test_str.data, "hello", r->method_name.len) )

任何試圖將ngx_str_t的data成員當做字串來使用的情況,都可能導致記憶體越界!

ngx_list_t是nginx封裝的鍊錶容器,它在nginx中使用得很頻繁,例如http的頭部就是用ngx_list_t來儲存的。

定義:

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_part_t又是乙個陣列,擁有連續的記憶體,它既依賴於ngx_list_t裡的size和nalloc來表示陣列的容量,同時又依靠每個ngx_list_part_t成員中的nelts來表示陣列當前已使用了多少容量。因此,ngx_list_t是乙個鍊錶容器,而鍊錶中的元素又是乙個陣列。ngx_list_part_t陣列中的元素才是使用者想要儲存的東西

每個成員的意義:

(1)ngx_list_t

·part:鍊錶的首個陣列元素。

·last:指向鍊錶的最後乙個陣列元素。

·size:通過size限制每乙個陣列元素的占用的空間大小,也就是使用者要儲存的乙個資料所占用的位元組數必須小於或等於size。

·nalloc:nalloc表示每個ngx_list_part_t陣列的容量,即最多可儲存多少個資料。

·pool:鍊錶中管理記憶體分配的記憶體池物件。ngx_list_t中的所有資料都是由ngx_pool_t型別的pool記憶體池分配的,它們通常都是連續的記憶體。

(2)ngx_list_part_t

·nelts:表示陣列中已經使用了多少個元素。nelts必須小於ngx_list_t結構體中的nalloc。

圖中是由3個ngx_list_part_t陣列元素組成的ngx_list_t鍊錶的一種記憶體分布結構,pool記憶體池為其分配了連續的記憶體,最前端記憶體儲存的是ngx_list_t結構中的成員,緊接著是第乙個ngx_list_part_t結構占用的記憶體,然後是ngx_list_part_t結構指向的陣列,它們一共占用size*nalloc位元組,表示陣列中擁有nalloc個大小為size的元素。其後面是第2個ngx_list_part_t結構以及它所指向的陣列,依此類推。

ngx_table_elt_t資料結構如下所示:

typedef struct 

ngx_table_elt_t;

ngx_table_elt_t就是乙個key/value對,ngx_str_t型別的key、value成員分別儲存的是名字、值字串。

hash用於快速檢索頭部。lowcase_key指向的是全小寫的key字串。

ngx_table_elt_t是為http頭部「量身訂製」的,其中key儲存頭部名稱(如content-length),value儲存對應的值(如「1024」)。

struct ngx_buf_s ;
ngx_chain_t是與ngx_buf_t配合使用的鍊錶資料結構:

typedef struct ngx_chain_s ngx_chain_t;

struct ngx_chain_s

;

buf指向當前的ngx_buf_t緩衝區,next則用來指向下乙個ngx_chain_t。如果這是最後乙個ngx_chain_t,則需要把next置為null。

在向使用者傳送http包體時,就要傳入ngx_chain_t鍊錶物件,如果是最後乙個ngx_chain_t,那麼必須將next置為null,否則永遠不會傳送成功!而且這個請求將一直不會結束(nginx框架的要求)。

參考: 《深入理解nginx》  陶輝  機械工業出版社

nginx中ngx list的資料結構

今天沒事了,在檢視nginx源 中看到ngx list的結構,發現設計為鍊錶陣列的形式,不知道為什麼這樣設計 struct ngx list part s typedef struct ngx list t 只實現三個方法 ngx list t ngx list create ngx pool t ...

資料結構基礎 週末舞會 詳細題解

題目描述 假設在週末舞會上,男士們和女士們進入舞廳時,各自排成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人配成舞伴。規定每個舞曲能有一對跳舞者。若兩隊初始人數不相同,則較長的那一隊中未配對者等待下一輪舞曲。現要求寫乙個程式,模擬上述舞伴配對問題。輸入 第一行兩個正整數,表示男士人數m和女士人數...

資料結構基礎45 牛的旅行 詳細題解

題目描述 農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有這樣的限制 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到的所有距離指的都...