Nginx原始碼分析之ngx array t

2021-07-25 12:38:25 字數 2700 閱讀 2965

ngx_array_t是乙個順序容器,類似於stl中的vector可以動態擴容。

原始碼位置:

nginx/src/core/ngx_array.h

nginx/src/core/ngx_array.c

typedef

struct ngx_array_s ngx_array_t;

struct ngx_array_s ;

//建立動態陣列,分配n個大小為size的空間

ngx_array_t *

ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)

a->elts = ngx_palloc(p, n * size);

if (a->elts == null)

a->nelts = 0;

a->size = size;

a->nalloc = n;

a->pool = p;

return a;

}//銷毀已經分配的陣列元素空間和動態陣列物件

void

ngx_array_destroy(ngx_array_t *a)

if ((u_char *) a + sizeof(ngx_array_t) == p->d.last)

}//向當前動態陣列a中新增乙個元素,返回新新增元素的位址

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;

}//要新增n個元素,返回新新增這一批元素的首位址

void *

ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)

else

ngx_memcpy(new, a->elts, a->nelts * a->size);

a->elts = new;

a->nalloc = nalloc;}}

elt = (u_char *) a->elts + a->size * a->nelts;

a->nelts += n;

return elt;

}

乙個直觀的圖來看ngx_array_t資料結構記憶體分布。

根據圖中所示ngx_array_create返回的位址跟elts的位址還有乙個array頭的差距,一會測試**可以測試驗證。

#include 

#include

#include "ngx_config.h"

#include "nginx.h"

#include "ngx_conf_file.h"

#include "ngx_core.h"

#include "ngx_string.h"

#include "ngx_palloc.h"

#include "ngx_list.h"

#include "ngx_queue.h"

#include "ngx_array.h"

volatile ngx_cycle_t *ngx_cycle;

void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log,

ngx_err_t err, const

char *fmt, ...)

typedef

structstuinfo;

void printarray(ngx_array_t *);

void dumparrayinfo(ngx_array_t *);

int main(int argc,char**argv)

void dumparrayinfo(ngx_array_t *a)

void printarray(ngx_array_t *a)

while(seqnelts);

#endif

do while(seqnelts);

}

列印結果如下:

根據結果,可以知道:

1.驗證了(三)中ngx_array_create返回的位址跟elts的位址還有乙個array頭的差距

2.當pool不重新分配的時候,nelts跟nalloc共同增長,這一點跟vector有一點區別,如果把nelts元素個數比作vector中的size,把nalloc比作capability,那麼在vector中,一旦size>capability就會擴容。這一點從原始碼中很容易驗證。

nginx原始碼分析之ngx list

ngx list t是nginx封裝鍊錶的容器,其原始碼位於 宣告 nginx src core ngx list.h 定義 nginx src core ngx list.c 在nginx中使用頻繁,例如http頭部就是用ngx list t儲存的。nginx的鍊錶 頭 結構為ngx list t...

nginx 原始碼分析

近期準備研究一下nginx原始碼,此處記錄一下。計畫 1 了解evan miller 的文章 2 了解nginx的組織架構 3 了解nginx的基本資料結構 4 熟悉nginx的主要module及執行機制,主要是core http event os 5 簡單的module開發及測試 一 準備 為了方...

nginx原始碼分析 從原始碼看nginx框架總結

nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...