Nginx高階資料結構原始碼分析(三) 鍊錶

2021-07-04 20:54:41 字數 1538 閱讀 2250

ngx_list_t是nginx封裝的鍊錶容器,使用的很頻繁。它有兩個結構體,ngx_list_t描述的是整個鍊錶,而ngx_list_part_t只描述鍊錶的乙個元素。為了方便理解,我們可以將它稱為陣列的鍊錶。也就是是說,ngx_list_t是乙個鍊錶容器,而鍊錶中的元素又是乙個陣列。事實上,ngx_list_part_t陣列中的元素才是使用者需要儲存的東西。

這樣的結構表達方式有什麼樣的好處:

(1)鍊錶中儲存的元素是靈活的,它可以是任何一種資料結構;

(2)鍊錶元素需要占用的記憶體由ngx_list_t管理,它已經通過陣列分配好了;

(3)小塊的記憶體使用鍊錶訪問效率是低下的,使用陣列通過偏移量訪問記憶體則要高效的多。

ngx_list_t結構體的定義:

typedef struct  ngx_list_t;
ngx_list_part_t結構體的定義:

struct ngx_list_part_s ;
初始化陣列鍊錶:

static ngx_inline ngx_int_t

ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)//初始化鍊錶

list->part.nelts = 0; //開始陣列元素中只有0個元素

list->part.next = null;

list->last = &list->part;//指向第乙個節點

list->size = size;

list->nalloc = n;

list->pool = pool;//記憶體池物件

return ngx_ok;

}

建立陣列鍊錶:

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;

}

新增新的元素:

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原始碼學習 資料結構 ngx str

nginx中關於字串的資料結構位於src core ngx string.c和src core ngx string.h中 先來看一下資料結構 1 typedef struct ngx str t data指標指向字串起始位址,len表示字串的有效長度。這裡面的data並不保證以 0 結尾,所以必須...

nginx原始碼學習 資料結構 ngx int

nginx中關於整型的資料結構位於src core ngx config.h中 結構比較簡單,就是乙個typedef的操作,具體如下 1 typedef intptr t ngx int t 2typedef uintptr t ngx uint t 3 typedef intptr t ngx f...

Nginx原始碼結構

上一章對nginx的架構有了乙個初步的了解。這章,為了對原始碼仔細的剖析,先要對nginx的原始碼結構有乙個了解。從巨集觀上把握原始碼模組的結構。一.nginx原始碼的3個目錄結構 在安裝的nginx的目錄下,有乙個目錄src,這裡邊存放了nginx的所有源 包括 core,event,http,m...