日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结合源码看nginx-1.4.0之nginx内存管理详解

發布時間:2024/1/17 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结合源码看nginx-1.4.0之nginx内存管理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

0. 摘要

1. nginx內存結構設計

2. nginx內存數據結構

3. nginx內存管理原理

4. 一個簡單的內存模型

5. 小結

6. 參考資料

0. 摘要

內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且在適當的時候釋放和回收內存資源。

在講解nginx內存管理之前,先思考以下幾個問題。(在小結中會一一回答)

(1)nginx為什么要進行內存管理?

(2)nginx如何進行內存管理?

(3)nginx的內存管理解決了哪些問題?

1. nginx內存結構設計

圖1.1 nginx內存結構設計圖(1)

nginx采用內存池的結構設計來管理內存。內存池是由若干固定大小的內存塊組成的單向鏈表。每個內存塊的設計圖如圖1.1。一個簡單的內存池如圖1.2

圖1.2 nginx內存結構設計圖(2)

從圖1.2中可以看出,內存池的頭結點維護著內存池的總體信息,從頭結點開始,可以訪問內存池的小塊內存(單向鏈表,由ngx_pool_data_t維護),大塊內存(單向鏈表,由ngx_pool_large_t維護),以及抽象內存數據(單向鏈表,由ngx_pool_chain_t維護)。內存池結構涉及的具體數據結構在第2節講解,內存池的管理包括初始化、創建、分配、銷毀四部分,在第3節講解。

2. nginx內存數據結構

2.1 內存池基礎數據結構

(1)內存池?ngx_pool_t:負責整個內存池的管理。

1 typedef struct ngx_pool_s ngx_pool_t; 2 struct ngx_pool_s { // 內存池的管理分配模塊 3 ngx_pool_data_t d; // 內存池的數據塊 4 size_t max; // 數據塊大小,小塊內存的最大值 5 ngx_pool_t *current; // 指向內存池可用數據塊 6 ngx_chain_t *chain; // 該指針掛接一個ngx_chain_t結構 7 ngx_pool_large_t *large; // 指向大塊內存分配,nginx中,大塊內存分配直接采用標準系統接口malloc 8 ngx_pool_cleanup_t *cleanup; // 析構函數,掛載內存釋放時需要清理資源的一些必要操作 9 ngx_log_t *log; // 內存分配相關的日志記錄 10 };

(2)ngx_pool_data_t:負責內存池小塊數據的管理。

1 typedef struct { // 內存池的數據結構模塊 2 u_char *last; // 當前內存分配結束位置,即下一段可分配內存的起始位置 3 u_char *end; // 內存池的結束位置 4 ngx_pool_t *next; // 鏈接到下一個內存池,內存池的很多塊內存就是通過該指針連成鏈表的 5 ngx_uint_t failed; // 記錄內存分配不能滿足需求的失敗次數,當失敗次數大于指定值時 current 指向下一內存池單元 6 } ngx_pool_data_t; // 結構用來維護內存池的數據塊,供用戶分配小塊內存使用。

(3)ngx_chain_t:負責內存池抽象數據的管理,比如緩存數據,文件數據。

1 typedef struct ngx_buf_s ngx_buf_t; 2 struct ngx_buf_s { 3 u_char *pos; // 當buf所指向的數據在內存里的時候,pos指向的是這段數據開始的位置。 4 u_char *last; // 當buf所指向的數據在內存里的時候,last指向的是這段數據結束的位置。 5 off_t file_pos; // 當buf所指向的數據是在文件里的時候,file_pos指向的是這段數據的開始位置在文件中的偏移量。 6 off_t file_last; // 當buf所指向的數據是在文件里的時候,file_last指向的是這段數據的結束位置在文件中的偏移量。 7 /* 當buf所指向的數據在內存里的時候,這一整塊內存包含的內容可能被包含在多個buf中(比如在某段數據中間插入了其他的數據,這一塊數據就需要被拆分開)。那么這些buf中的start和end都指向這一塊內存的開始地址和結束地址。而pos和last指向本buf所實際包含的數據的開始和結尾。 8 */ 9 u_char *start; 10 // 解釋參考 start 11 u_char *end; /* end of buffer */ 12 ngx_buf_tag_t tag; 13 ngx_file_t *file; // 當buf所包含的內容在文件中是,file字段指向對應的文件對象。 14 /* 當這個buf完整copy了另外一個buf的所有字段的時候,那么這兩個buf指向的實際上是同一塊內存,或者是同一個文件的同一部分,此時這兩個buf的shadow字段都是指向對方的。那么對于這樣的兩個buf,在釋放的時候,就需要使用者特別小心,具體是由哪里釋放,要提前考慮好,如果造成資源的多次釋放,可能會造成程序崩潰!*/ 15 ngx_buf_t *shadow; 16 17 /* the buf's content could be changed */ 18 // 為1時表示該buf所包含的內容是在一個用戶創建的內存塊中,并且可以被在filter處理的過程中進行變更,而不會造成問題。 19 unsigned temporary:1; 20 21 /* 22 * the buf's content is in a memory cache or in a read only memory 23 * and must not be changed 24 */ // 為1時表示該buf所包含的內容是在內存中,但是這些內容確不能被進行處理的filter進行變更。 25 unsigned memory:1; 26 27 /* the buf's content is mmap()ed and must not be changed */ 28 // 為1時表示該buf所包含的內容是在內存中, 是通過mmap使用內存映射從文件中映射到內存中的,這些內容確不能被進行處理的filter進行變更。 29 unsigned mmap:1; 30 31 unsigned recycled:1; 32 unsigned in_file:1; // 為1時表示該buf所包含的內容是在文件中。 33 /* 遇到有flush字段被設置為1的的buf的chain,則該chain的數據即便不是最后結束的數據(last_buf被設置,標志所有要輸出的內容都完了),也會進行輸出,不會受postpone_output配置的限制,但是會受到發送速率等其他條件的限制。 34 */ 35 unsigned flush:1; 36 unsigned sync:1; 37 unsigned last_buf:1; // 數據被以多個chain傳遞給了過濾器,此字段為1表明這是最后一個buf。 38 /* 在當前的chain里面,此buf是最后一個。特別要注意的是last_in_chain的buf不一定是last_buf,但是last_buf的buf一定是last_in_chain的。這是因為數據會被以多個chain傳遞給某個filter模塊。 39 */ 40 unsigned last_in_chain:1; 41 42 unsigned last_shadow:1; 43 unsigned temp_file:1; 44 45 /* STUB */ int num; 46 };

(4)ngx_pool_large_t:負責內存池大塊數據(size>max)的管理,大塊內存直接實時向系統申請。

1 typedef struct ngx_pool_large_s ngx_pool_large_t; 2 struct ngx_pool_large_s { 3 ngx_pool_large_t *next; 4 void *alloc; 5 };

(5)ngx_pool_cleanup_t:負責內存池數據的回收。引用:“cleanup字段管理著一個特殊的鏈表,該鏈表的每一項都記錄著一個特殊的需要釋放的資源。對于這個鏈表中每個節點所包含的資源如何去釋放,是自說明的。這也就提供了非常大的靈活性。意味著,ngx_pool_t不僅僅可以管理內存,通過這個機制,也可以管理任何需要釋放的資源,例如,關閉文件,或者刪除文件等。”從這點來說,本篇文章確切地說,應該是資源管理,而不只是內存管理。

1 typedef void (*ngx_pool_cleanup_pt)(void *data); 2 typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t; 3 struct ngx_pool_cleanup_s { 4 ngx_pool_cleanup_pt handler; // 函數指針 5 void *data; // 實際數據 6 ngx_pool_cleanup_t *next; 7 };

(6)ngx_log_t:當內存池數據操作出現錯誤(一般是申請失敗)時打印日志。

1 typedef struct ngx_log_s ngx_log_t; 2 struct ngx_log_s { 3 ngx_uint_t log_level; 4 ngx_open_file_t *file; 5 ngx_atomic_uint_t connection; 6 ngx_log_handler_pt handler; 7 void *data; 8 /* 9 * we declare "action" as "char *" because the actions are usually 10 * the static strings and in the "u_char *" case we have to override 11 * their types all the time 12 */ 13 char *action; 14 };

2.2 內存池主要基本操作

(1)創建內存池:ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);分配一個內存頁,并初始化相應字段。?

ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);if (p == NULL) {return NULL;}p->d.last = (u_char *) p + sizeof(ngx_pool_t);p->d.end = (u_char *) p + size;p->d.next = NULL;p->d.failed = 0;size = size - sizeof(ngx_pool_t);p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;p->current = p;p->chain = NULL;p->large = NULL;p->cleanup = NULL;p->log = log;return p; }

?(2)分配內存:void * ngx_palloc(ngx_pool_t *pool, size_t size);?根據size大小決定具體行為:a.在當前內存頁分配 b. 在新內存也分配 c. 向系統申請大塊內存

1 // ngx_palloc和ngx_pnalloc都是從內存池里分配size大小內存,至于分得的是小塊內存還是大塊內存,將取決于size的大小; 2 // 他們的不同之處在于,palloc取得的內存是對齊的,pnalloc則否。 3 void * 4 ngx_palloc(ngx_pool_t *pool, size_t size) 5 { 6 u_char *m; 7 ngx_pool_t *p; 8 9 if (size <= pool->max) { 10 p = pool->current; 11 do { 12 m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT); 13 if ((size_t) (p->d.end - m) >= size) { 14 p->d.last = m + size; 15 return m; 16 } 17 p = p->d.next; 18 } while (p); 19 //如果遍歷完整個內存池鏈表均未找到合適大小的內存塊供分配,則執行ngx_palloc_block()來分配。 20 //ngx_palloc_block()函數為該內存池再分配一個block,該block的大小為鏈表中前面每一個block大小的值。 21 //一個內存池是由多個block鏈接起來的。分配成功后,將該block鏈入該poll鏈的最后, 22 //同時,為所要分配的size大小的內存進行分配,并返回分配內存的起始地址。 23 return ngx_palloc_block(pool, size); 24 } 25 return ngx_palloc_large(pool, size); 26 }

(3)銷毀內存池:void ngx_destroy_pool(ngx_pool_t *pool); 分三步走:一,執行cleanup清理;二,釋放大塊內存;三,釋放小塊內存(內存頁)。

1 #define ngx_free free 2 void 3 ngx_destroy_pool(ngx_pool_t *pool) 4 { 5 ngx_pool_t *p, *n; 6 ngx_pool_large_t *l; 7 ngx_pool_cleanup_t *c; 8 9 printf("ngx_destroy_pool::ngx_destroy_pool:%p\n", ngx_destroy_pool); 10 get_systime(buf, 100); 11 // printf("ngx_destroy_pool:%s\n",buf); 12 13 // 執行資源(比如文件關閉,刪除等)清理函數 14 for (c = pool->cleanup; c; c = c->next) { 15 if (c->handler) { 16 ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, 17 "run cleanup: %p", c); 18 c->handler(c->data); 19 } 20 } 21 // 釋放大塊內存 22 for (l = pool->large; l; l = l->next) { 23 24 ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc); 25 26 if (l->alloc) { 27 ngx_free(l->alloc); 28 } 29 } 30 31 // 釋放小塊內存,一個pagesize 32 for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) { 33 ngx_free(p); 34 35 if (n == NULL) { 36 break; 37 } 38 } 39 }

(4)其他:src/core/ngx_palloc.c其他函數說明

1)void ngx_reset_pool(ngx_pool_t *pool);

// 該函數釋放pool中所有大塊內存鏈表上的內存,小塊內存鏈上的內存塊都修改為可用。但不會去處理cleanup鏈表上的項目。 // 這說明重置pool只是要利用小塊內存資源

?2)void * ngx_pnalloc(ngx_pool_t *pool, size_t size);

// ngx_palloc和ngx_pnalloc都是從內存池里分配size大小內存,至于分得的是小塊內存還是大塊內存,將取決于size的大小; // 他們的不同之處在于,palloc取得的內存是對齊的,pnalloc則否。

?3)static void * ngx_palloc_block(ngx_pool_t *pool, size_t size);

// ngx_palloc_block()函數為該內存池再分配一個block,該block的大小為鏈表中前面每一個block大小的值。 // 一個內存池是由多個block鏈接起來的。分配成功后,將該block鏈入該poll鏈的最后, // 同時,為所要分配的size大小的內存進行分配,并返回分配內存的起始地址。

?4)static void * ngx_palloc_large(ngx_pool_t *pool, size_t size);

// 執行ngx_palloc和ngx_pnalloc時,若size>max,則會調用ngx_palloc_large // 新的大塊內存將會被掛接到pool->large上,即加入鏈表頭部

?5)void * ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);

// ngx_pmemalign將在分配size大小的內存并按alignment對齊,然后掛到large字段下,當做大塊內存處理。 // 內存對齊的好處就是提高了CPU取數據的效率

?6)ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);?

// 釋放指定大塊內存 // 該函數的實現是順序遍歷large管理的大塊內存鏈表。所以效率比較低下。 // 如果在這個鏈表中找到了這塊內存,則釋放,并返回NGX_OK。否則返回NGX_DECLINED。 // 由于這個操作效率比較低下,除非必要,也就是說這塊內存非常大,確應及時釋放,否則一般不需要調用。

?7)void * ngx_pcalloc(ngx_pool_t *pool, size_t size);

// ngx_pcalloc是直接調用palloc分配好內存,然后進行一次0初始化操作。

?8)ngx_pool_cleanup_t * ngx_pool_cleanup_add(ngx_pool_t *p, size_t size);?

// 這個 size就是要存儲這個data字段所指向的資源的大小。 // 比如我們需要最后刪除一個文件。那我們在調用這個函數的時候,把size指定為存儲文件名的字符串的大小, // 然后調用這個函數給cleanup鏈表中增加一項。該函數會返回新添加的這個節點。我們然后把這個節點中的data字段拷貝為文件名。 // 把hander字段賦值為一個刪除文件的函數(當然該函數的原型要按照void (*ngx_pool_cleanup_pt)(void *data);)。

?9)void ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd);

// 對內存池進行文件清理操作,即執行handler,此時handler==ngx_pool_cleanup_file

?10)void ngx_pool_cleanup_file(void *data);

// 關閉data指定的文件句柄

?11)void ngx_pool_delete_file(void *data);

// 刪除data指定的文件?

3. nginx內存管理原理

3.1 內存管理初始化

我們知道,在nginx正式進入事件處理流程之前,nginx在主流程中(main函數)會進行一系列的初始化工作,這是為以后的master-worker運行模式準備資源,也為各模塊的運行準備條件。同樣,在創建一個內存池之前,nginx需要知道程序處在什么樣的系統環境中,這些系統變量會影響nginx的內存管理效率。

3.1.1 內存對齊

(1)為什么要內存對齊

? ? ? 內存對齊是操作系統為了快速訪問內存而采取的一種策略。因為處理器讀寫數據,并不是以字節為單位,而是以塊(2,4,8,16字節)為單位進行的,而且由于操作系統的原因,塊的起始地址必須整除塊大小。如果不進行對齊,那么本來只需要一次進行的訪問,可能需要好幾次才能完成,并且還要進行額外的數據分離和合并,導致效率低下。更嚴重地,有的CPU因為不允許訪問unaligned address,就報錯,或者打開調試器或者dump core,比如sun sparc solaris絕對不會容忍你訪問unaligned address,都會以一個core結束你的程序的執行。所以一般編譯器都會在編譯時做相應的優化以保證程序運行時所有數據地址都是在'aligned address'上的,這就是內存對齊的由來。

? ? ? 為了更好理解上面的意思,這里給出一個示例。在32位系統中,假如一個int變量在內存中的地址是0x00ff42c3,因為int是占用4個字節,所以它的尾地址應該是0x00ff42c6,這個時候CPU為了讀取這個int變量的值,就需要先后讀取兩個4字節的塊,分別是0x00ff42c0~0x00ff42c3和0x00ff42c4~0x00ff42c7,然后通過移位等一系列的操作來得到,在這個計算的過程中還有可能引起一些總線數據錯誤的。但是如果編譯器對變量地址進行了對齊,比如放在0x00ff42c0,CPU就只需要一次就可以讀取到,這樣的話就加快讀取效率

? ? ?綜合,內存對齊的原因有2點:
? ? 1) 平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
? ? 2) 性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要至少要兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

(2)在linux上如何內存對齊

內存對齊可以用一句話來概括:"數據項只能存儲在地址是數據項大小的整數倍的內存位置上"。

每個特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16 來改變這一系數,其中的n 就是你要指定的“對齊系數”。
規則1:
數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0 的地方,以后每個數據成員的對齊按照#pragma pack 指定的數值和這個數據成員自身長度中,比較小的那個進行。
規則2:
結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之后,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
規則3:
結合1、2 顆推斷:當#pragma pack 的n值等于或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。

在這就不展開討論內存對齊的細節了。

(3)nginx為內存對齊做了哪些

#define NGX_POOL_ALIGNMENT 16#ifndef NGX_ALIGNMENT #define NGX_ALIGNMENT sizeof(unsigned long) /* platform word */ #endif // 兩個參數d和a,d代表未對齊內存地址,a代表對齊單位,必須為2的冪。假設a是8,那么用二進制表示就是1000,a-1就是0111. // d + a-1之后在第四位可能進位一次(如果d的前三位不為000,則會進位。反之,則不會), // ~(a-1)是1111...1000,&之后的結過就自然在4位上對齊了。注意二進制中第四位的單位是8,也就是以8為單位對齊。 // 例如,d=17,a=8,則結果為24.所以該表達式的結果就是對齊了的內存地址 #define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1)) // 對指針地址進行內存對齊,原理同上 #define ngx_align_ptr(p, a) \(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))

3.1.2 內存分頁

本小節主要解釋創建內存池函數中的語句:p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;該語句限制了內存池可用內存的最大值。也就是說當創建內存池的size>NGX_MAX_ALLOC_FROM_POOL時會造成內存浪費。但nginx為什么會這么做呢?

(1)為什么要內存分頁

? ? ?在存儲器管理中,連續分配方式會形成許多“碎片”,雖然可通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。如果允許將一個進程直接分散地裝入到許多不相鄰的分區中,則無須再進行“緊湊”。基于這一思想而產生了離散分配方式。如果離散分配的基本單位是頁,則稱為分頁存儲管理方式。
? ? ?分頁管理器把地址空間劃分成4K大小的頁面(非Intel X86體系與之不同),當進程訪問某個頁面時,操作系統首先在Cache中查找頁面,如果該頁面不在內存中,則產生一個缺頁中斷(Page Fault),進程就會被阻塞,直至要訪問的頁面從外存調入內存中。
? ? ?綜上,內存分頁管理使得進程的地址空間可以為整個物理內存地址空間(如4G),一個頁面經過映射后在實際物理空間中是連續存儲的。根據程序局部性原理,如果程序的指令在一段時間內訪問的內存都在同一頁面內,則會提高cache命中率,也就提高了訪存的效率。

(2)nginx內存分頁好處

從上可以看出,內存分頁管理使得程序向系統申請一個頁面的內存時,該頁內存地址在物理內存地址空間中是連續分布的,這提高了cache命中率。如果申請的內存大于一個內存頁,則會降低程序指令訪存cache命中率。所以,在nginx內存池小塊內存管理單元中,其有效內存的最大值為一個頁面大小。

3.2 內存池的創建

經過測試,nginx在為每個http連接(connection)創建size為256的pool,為每個請求(request)創建size為4096的pool。當客戶端使用長連接向服務器請求資源時,nginx完成request后會釋放request對應的pool,而不立即釋放connection對應的pool,等超時后再釋放。在一次簡單的會話中(請求首頁),連接建立到關閉期間,至少有30次的內存分配(調用ngx_palloc)。

3.3 內存池的分配

從第二節的函數介紹可以看到,nginx內存分配有種形式,小塊內存分配包括用戶數據、維護內存池鏈表數據結構數據等,大塊數據包括大的資源文件等。

3.3.1 小塊內存分配(size<=max)

圖3.1 nginx小塊內存池分配圖

? ? ?上圖這個內存池模型是由上3個小內存池構成的,由于第一個內存池上剩余的內存不夠分配了,于是就創建了第二個新的內存池,第三個內存池是由于前面兩個內存池的剩余部分都不夠分配,所以創建了第三個內存池來滿足用戶的需求。

? ? ?failed表示的是當前這個內存池的剩余可用內存不能滿足用戶分配請求的次數,即是說:一個分配請求到來后,在這個內存池上分配不到想要的內存,那么就failed就會增加1;這個分配請求將會遞交給下一個內存池去處理,如果下一個內存池也不能滿足,那么它的failed也會加1,然后將請求繼續往下傳遞,直到滿足請求為止(如果沒有現成的內存池來滿足,會再創建一個新的內存池)。
? ? ?current字段會隨著failed的增加而發生改變,如果current指向的內存池的failed達到了4的話,current就指向下一個內存池了。猜測:4這個值應該是Nginx作者的經驗值,或者是一個統計值。

3.3.2 大塊內存分配(size>max)

? ? ?大塊內存的分配請求不會直接在內存池上分配內存來滿足,而是直接向操作系統申請這么一塊內存(就像直接使用malloc分配內存一樣),然后將這塊內存掛到內存池頭部的large字段下。內存池的作用在于解決小塊內存池的頻繁申請問題,對于這種大塊內存,是可以忍受直接申請的。為什么大塊內存分配后是掛在鏈表頭部而不是尾部呢?根據程序局部性原理,最近分配的內存一般經常使用,掛在頭部可以提高查找效率。
? ? ?圖3.2展示了大塊內存分配情況:

圖3.2 nginx大塊內存池分配圖

? ? ?注意每塊大內存都對應有一個頭部結構(next&alloc),這個頭部結構是用來將所有大內存串成一個鏈表用的。這個頭部結構不是直接向操作系統申請的,而是當做小塊內存(頭部結構沒幾個字節)直接在內存池里申請的。這樣的大塊內存在使用完后,可能需要第一時間釋放,節省內存空間,因此nginx提供了接口函數:
? ? ?ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);
? ? ?此函數專門用來釋放某個內存池上的某個大塊內存,p就是大內存的地址。ngx_pfree只會釋放大內存,不會釋放其對應的頭部結構,畢竟頭部結構是當做小內存在內存池里申請的;遺留下來的頭部結構會作下一次申請大內存之用。

3.3.3 資源內存分配

? ? ?nginx內存池中除了存放物理內存資源,還存放著其他資源,比如文件、緩存等。每個進程能打開的文件句柄是有限的,所以分配了文件資源后需要及時釋放。nginx定義了chain和cleanup字段來支持靈活的自主資源分配,這樣當連接關閉時,通過銷毀內存池就可以一次性回收這次連接占用的系統資源。
? ? ?圖3.3展示了自定義資源分配情況:

圖3.3 nginx自定義資源分配圖

? ? ?可以看到所有掛載在內存池上的資源將形成一個循環鏈表。
? ? ?由圖可知,每個需要清理的資源都對應有一個頭部結構,這個結構中有一個關鍵的字段handler,handler是一個函數指針,在掛載一個自定義資源到內存池上的時候,同時也會注冊一個清理資源的函數到這個handler上。即是說,內存池在清理cleanup的時候,就是調用這個handler來清理對應的資源。
? ? ?比如:我們可以將一個開打的文件描述符作為資源掛載到內存池上,同時提供一個關閉文件描述的函數注冊到handler上,那么內存池在釋放的時候,就會調用我們提供的關閉文件函數來處理文件描述符資源了。

3.4 內存池的銷毀

? ? ?一個web server總是不停的接受connection和request,所以nginx就將內存池分了不同的等級,有進程級的內存池、connection級的內存池、request級的內存池。也就是說,創建好一個worker進程的時候,同時為這個worker進程創建一個內存池,待有新的連接到來后,就在worker進程的內存池上為該連接創建起一個內存池;連接上到來一個request后,又在連接的內存池上為request創建起一個內存池。這樣,在request被處理完后,就會釋放request的整個內存池,連接斷開后,就會釋放連接的內存池;worker進程退出后就會釋放worker級的內存池。因而,就保證了內存有分配也有釋放。
? ? ?通過內存的分配和釋放可以看出,nginx內存池的主要作用將小塊內存的申請聚集到一起申請,然后一起釋放。避免了頻繁申請小內存,降低內存碎片的產生等問題。

4. 一個簡單的內存模型

學以致用,對源碼的學習不能只停留在閱讀上,而應該去實踐。如果能夠對目前的工作有所幫助那就更好了。為此,本人從nginx源碼中提取內存管理模塊代碼,供以后的工作借鑒,參考。

5. 小結

先回答摘要中的問題

(1)nginx為什么要進行內存管理?

1)nginx作為高性能web服務器,在各個環節都必須考慮如何提高性能的問題。

2)《編程珠璣》中文第2版第9章-“代碼調優”中講了一個典型的故事,主要講Chris Van Wyk花了幾個小時把一個3000行的圖形程序的運行時間減少了一半,而其中的主要優化就是減少不必要的malloc。這說明malloc操作是很耗時的。

3)使用系統的malloc和free面臨幾個問題:web服務器對內存的需求有大有小,系統運行久了會產生大量的內存碎片,最終造成內存操作更加耗時直到無可用內存,導致服務器宕機。

(2)nginx如何進行內存管理?

nginx首先將內存池分級:進程級、連接級、請求級;然后按照內存使用情況的不同分類:小塊內存、大塊內存、自定義資源內存。

進程級內存池通過fork完成創建(fork()創建子進程時,子進程復制了父進程的數據段和堆棧段);根據web server的特點,客戶端建立連接時創建連接級內存池(在void ngx_event_accept(ngx_event_t *ev);函數中調用),客戶端請求資源時創建請求級內存池(在 void??ngx_http_init_connection(ngx_connection_t *c)函數中調用)。

進程在處理http請求過程中需要的內存均在該連接對應的內存池中分配,根據需要的內存大小和資源種類進行不同的分配操作。()

進程在處理完http請求后釋放請求級內存池;當連接超時或斷開時,釋放連接級內存;當進程退出時,銷毀該進程占用的所有內存池資源。

(3)nginx的內存管理解決了哪些問題?

1)簡化了內存操作:程序員不必擔心何時釋放內存,當連接釋放時,就回收該連接對應的內存池。

2)避免了內存碎片:從外部內存碎片來看,采用一次性申請一個內存頁,避免了外部內存碎片;從內部內存碎片來看,對大小內存申請分別管理,提高了內存利用率,避免了內部內存碎片。

3)避免了內存泄露:在同一內存池上進行內存申請和回收,當連接關閉后,不存在沒有回收的內存。

4)提高了內存訪問效率:充分利用程序局部性原理,結合內存對齊和內存分頁機制,有效提高了CPU訪存的cache命中率。

6. 參考資料

網絡博客及nginx-1.4.0源碼。

1. 內存對齊:關于內存對齊問題的一些資料整理? ?內存對齊

2. 內存分頁:基本分頁存儲管理方式??分頁內存和非分頁內存區別

3. nginx內存分配:Nginx源碼剖析之內存池,與內存管理

4. nginx-1.4.0源碼:

?

轉載于:https://www.cnblogs.com/didiaoxiong/p/nginx_memory.html

總結

以上是生活随笔為你收集整理的结合源码看nginx-1.4.0之nginx内存管理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

天天草天天操 | 96av麻豆蜜桃一区二区 | av再线观看 | 九九热精品视频在线观看 | 97久久精品午夜一区二区 | 九九热免费在线观看 | 在线免费黄 | 91桃色在线观看视频 | 成人a级网站 | 日韩一区二区三区免费视频 | 中文字幕欧美日韩va免费视频 | 国产精品久久久久久久av大片 | 成人久久久电影 | 一本一本久久a久久精品牛牛影视 | 成人精品一区二区三区电影免费 | 欧洲av不卡| 五月婷婷视频在线 | 97成人在线观看 | 天天爽夜夜爽精品视频婷婷 | 精品久久久久久久久久岛国gif | 国产精品自产拍在线观看 | 日本久久久久久久久久 | 综合婷婷 | 日韩欧美精品在线观看视频 | 99久久99久久精品国产片果冰 | 99re视频在线观看 | 这里有精品在线视频 | 中文成人字幕 | 亚洲 欧美 综合 在线 精品 | 在线国产视频观看 | 国产精品黄色影片导航在线观看 | 中文字幕在线观看国产 | 韩日在线一区 | 久久久久99精品国产片 | 久操视频在线免费看 | 久久夜夜夜 | 国产色啪 | 国产专区视频在线 | 99精品在线观看视频 | 夜夜看av | 国产成人在线免费观看 | 久久综合久久综合这里只有精品 | 久草a在线 | 最近日本mv字幕免费观看 | 色999在线 | 中文字幕在线影视资源 | 五月天婷婷在线观看视频 | 国内精品免费久久影院 | 黄色av成人在线观看 | 国产精品久久久久999 | 亚洲三级毛片 | 天天狠狠 | 国产精品综合久久久久 | 精精国产xxxx视频在线播放 | 亚洲国产精品电影 | 99免在线观看免费视频高清 | 国产一级免费av | 久久这里只有精品首页 | 亚洲成人999 | 伊人天天狠天天添日日拍 | 久久人人爽人人人人片 | 欧美激情视频在线观看免费 | 亚洲精品乱码久久久久久写真 | 黄色中文字幕在线 | 网站在线观看日韩 | 人人射人人爱 | 国产精品一区二区果冻传媒 | 亚洲精品国产麻豆 | 亚洲高清激情 | 免费观看的黄色片 | 永久免费观看视频 | 日韩欧美高清在线观看 | 1024手机看片国产 | 在线影院 国内精品 | 国产免费三级在线观看 | 天天草视频 | 天天操婷婷 | 久久少妇av| 天天色.com| 日韩va在线观看 | 国产日韩欧美在线 | freejavvideo日本免费 | 日韩美精品视频 | 一区二区三区在线不卡 | 国产露脸91国语对白 | 九九综合久久 | 亚洲精品欧美成人 | 日韩av看片 | 国产精品日韩欧美 | 欧美俄罗斯性视频 | 国产亚洲精品久久久久久网站 | 九精品| 久久三级视频 | 伊甸园永久入口www 99热 精品在线 | 欧美日韩国产xxx | 久久综合五月天婷婷伊人 | 免费观看一区二区 | 日日操操 | 超碰成人av | 又黄又爽又色无遮挡免费 | 91丨九色丨国产在线 | 天天插日日插 | 91麻豆高清视频 | 久久久久久久国产精品 | 天天操天天色天天 | 久热av在线 | 在线 国产 日韩 | 久久精品视频免费 | 天天操天天干天天爽 | 精品久久久久免费极品大片 | 日韩三级视频在线看 | 日韩艹 | 亚洲精品黄色在线观看 | 综合伊人久久 | 亚洲精品色婷婷 | 一区中文字幕电影 | 日日夜夜国产 | 开心激情网五月天 | 久久精品视频在线看 | 四虎影视成人永久免费观看亚洲欧美 | 天天干天天上 | 国产黄色在线看 | 操操操av| 成人免费中文字幕 | 国产精品视频地址 | 日韩美视频 | 91探花国产综合在线精品 | av中文字幕免费在线观看 | 国产一区欧美一区 | 一区二区三区日韩在线观看 | 美女久久久久久久 | 香蕉视频色 | 日本激情视频中文字幕 | 亚洲性少妇性猛交wwww乱大交 | 国产一区电影在线观看 | 毛片网站在线观看 | 久久人人爽人人片 | 久久伊人91 | www.五月天激情 | 久久久久免费电影 | 免费视频97| 亚洲综合精品在线 | 成人在线电影观看 | 视频一区二区在线观看 | 黄色免费av | 亚洲综合小说电影qvod | 久久6精品| 国产黄色免费电影 | 国产v视频 | 深爱五月网 | 播五月综合 | 99视频国产精品免费观看 | 狠狠狠色丁香婷婷综合激情 | 成人网中文字幕 | 成人在线播放视频 | 国产精品k频道 | 欧美一区三区四区 | 国产日韩欧美在线看 | av丝袜在线| 亚洲天堂社区 | 黄色精品久久 | 超碰97中文 | 免费成人av电影 | 黄色一级网 | 国产精品99久久久久久有的能看 | 超碰99人人| 久久精品国产成人 | 婷婷视频在线 | 精品欧美一区二区在线观看 | 久久久免费观看视频 | 国产日产高清dvd碟片 | 久草视频99 | 午夜精品久久久久久久久久久久 | 日日夜夜狠狠操 | 国内精品久久久久久久久久久久 | 中文字幕乱码一区二区 | 丁香激情综合久久伊人久久 | 日韩精品久久久久 | 日韩一区二区三区不卡 | 久久99久久99| 国产五月| 91免费网 | 精品视频一区在线观看 | 美女国产精品 | 九九九九九精品 | 精品嫩模福利一区二区蜜臀 | 中文久久精品 | 毛片区 | 日日夜精品 | 国产日韩欧美精品在线观看 | 久久资源总站 | 欧美性受极品xxxx喷水 | 在线免费观看羞羞视频 | 国产亚洲视频在线 | 免费特级黄色片 | 久久久久国产视频 | 久草精品网 | 婷五月天激情 | www.夜夜夜| 欧美日韩久久 | 狠狠狠狠狠狠狠干 | 天天干天天干天天干天天干天天干天天干 | 激情五月播播久久久精品 | 日本特黄一级 | 国产又粗又猛又黄又爽 | 中文字幕在线视频一区二区三区 | 视频国产在线 | 日本99精品| 亚洲国产午夜视频 | 91中文字幕在线 | 日本中文字幕在线一区 | 精品自拍网 | 久久高清视频免费 | 日韩mv欧美mv国产精品 | 亚洲国产精品va在线看 | 亚洲精品午夜久久久久久久久久久 | 成 人 黄 色 视频 免费观看 | 国产日韩在线视频 | 亚洲一区二区精品3399 | 少妇做爰k8经典 | 欧美a视频| 欧美综合色在线图区 | 中国一级片在线 | 欧美性成人 | 国产一区私人高清影院 | 国产精品免费看久久久8精臀av | 国产香蕉视频 | 狠狠网 | 91精品视频播放 | 久久综合色婷婷 | 国产亚洲精品女人久久久久久 | 亚洲黄色小说网 | 久久不卡国产精品一区二区 | 亚洲国产中文在线 | 黄色av电影网| 亚洲成人一二三 | 国产手机在线观看视频 | 国产在线国偷精品产拍免费yy | 免费看污污视频的网站 | 日本精品小视频 | 国产直播av| 亚洲 欧美变态 另类 综合 | 高清av不卡 | 97在线精品 | wwwwww国产 | 天天玩夜夜操 | x99av成人免费 | 99久久精品国产一区二区成人 | 免费午夜网站 | 日韩电影在线观看一区二区三区 | 国产精品69av| 国产欧美久久久精品影院 | 亚洲综合在线五月 | 国产一区不卡在线 | 欧美做受xxx | 日韩无在线 | 免费裸体视频网 | 在线看片视频 | 国产成人精品日本亚洲999 | 国内精品久久久精品电影院 | 国产免费嫩草影院 | 天天操夜夜操 | 网站你懂的 | 国产精品久久久毛片 | 亚洲国产久 | 欧美va天堂va视频va在线 | 成人综合婷婷国产精品久久免费 | 韩国av免费观看 | 久久精品人 | 欧美日韩视频在线播放 | 亚洲国产网站 | 免费观看黄色12片一级视频 | 亚洲人在线7777777精品 | av黄色亚洲 | 免费婷婷| 欧美色一色 | 中国精品一区二区 | 美女黄频在线观看 | 五月婷婷丁香六月 | 97av精品 | 狠狠干狠狠久久 | 国产亚洲成av人片在线观看桃 | 国产成人在线综合 | 久久视频免费在线 | 久久精品美女视频 | 欧美男女爱爱视频 | 人人草人人做 | 亚洲精品乱码久久久一二三 | 97视频在线播放 | 草久久久久 | 久久精品5 | 欧美伦理一区二区三区 | 日韩女同一区二区三区在线观看 | 成人av在线电影 | 91一区啪爱嗯打偷拍欧美 | 99热官网 | 九九九九热精品免费视频点播观看 | 99久久婷婷国产 | 日韩精品一区二区三区在线视频 | 亚洲精品视频中文字幕 | 色永久免费视频 | 五月天综合网站 | 国产韩国日本高清视频 | 最新av网址在线观看 | 欧美电影黄色 | 日本在线观看黄色 | 四虎在线免费观看 | 91在线国内视频 | 四虎永久免费网站 | av黄色免费网站 | 在线观看网站你懂的 | 欧美91精品久久久久国产性生爱 | 亚洲精品国产品国语在线 | 99热亚洲精品 | 91精品国产自产在线观看永久 | 久久免费av | 婷婷丁香色 | 精品理论片 | 人人草网站 | 国产在线精品一区二区三区 | 欧美成人高清 | 天天爽天天射 | www.五月天婷婷 | 高清不卡毛片 | 国产不卡一二三区 | av一级免费 | 精品一区二区三区四区在线 | 91视视频在线直接观看在线看网页在线看 | 成人免费观看网站 | 久草香蕉在线 | 996久久国产精品线观看 | 精品xxx| 国产老熟 | 国产一区二区三区久久久 | 国产精品久久久久一区二区三区共 | 久久福利在线 | 99热最新 | 91精品日韩 | 国产精品日韩精品 | 亚州欧美精品 | 怡红院久久 | 欧美aa在线 | 人人爽人人澡 | 天天草夜夜 | 日韩在线免费视频观看 | 亚洲资源视频 | 欧美a级片网站 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产精品aⅴ | 天天操人人干 | 久久av免费| 天天射天天干天天插 | 国产精品成人久久 | 久久精品一区二区三区四区 | 国产在线999 | www.久久色| 香蕉视频国产在线观看 | 最近中文字幕在线中文高清版 | 午夜精品久久久久久久99热影院 | 免费看短 | 97av在线视频免费播放 | 久久久2o19精品 | 久久午夜视频 | 国产亚洲精品v | 日韩精品免费在线 | 国产理论片在线观看 | 一本一本久久a久久 | 国产在线视频一区二区三区 | 天堂在线一区二区 | 91在线产啪| 国产日韩精品一区二区三区在线 | 国产一区网| 怡红院久久 | 国产不卡视频在线播放 | 国产在线色站 | 三级av免费 | 国产一二区视频 | 91在线看黄 | 激情综合色综合久久综合 | 国产成人高清av | 在线免费观看的av网站 | 天天色宗合 | 最新av网址大全 | 久久精品一二区 | 五月婷婷色综合 | 亚洲精品美女在线观看播放 | 久久影视精品 | 激情六月婷婷久久 | 色99之美女主播在线视频 | 午夜视频导航 | a在线观看免费视频 | 亚洲免费小视频 | 九九免费在线观看视频 | 免费看一级黄色 | 久久综合丁香 | 一本—道久久a久久精品蜜桃 | 成年人免费av网站 | 亚洲欧美国产日韩在线观看 | 7777精品伊人久久久大香线蕉 | 超碰人人99 | 国产精品国产三级国产不产一地 | 在线观看中文 | 亚洲欧洲国产日韩精品 | 激情综合中文娱乐网 | 亚洲欧美国产视频 | 中文字幕精品一区久久久久 | 999久久久免费精品国产 | 99精品国产兔费观看久久99 | 五月激情片 | 亚洲欧美日韩精品一区二区 | 国产精品美女久久久 | 国产黄在线免费观看 | 日本特黄特色aaa大片免费 | 日韩欧美视频在线 | 91.精品高清在线观看 | 少妇bbw撒尿| 日韩影视在线观看 | 久久精品99国产精品日本 | 激情综合五月天 | 国产精品久久久久久婷婷天堂 | 日本黄色免费观看 | 久久天堂影院 | 国产二区av | 免费日韩av片 | 永久免费毛片在线观看 | 午夜黄色一级片 | 亚洲男模gay裸体gay | 成年人黄色免费网站 | 免费在线观看黄 | 欧美日韩久久不卡 | 亚洲精品成人免费 | 亚洲观看黄色网 | 日本aa在线| 国产精品色婷婷视频 | 免费看十八岁美女 | 免费在线观看成人小视频 | av三级在线播放 | 中文字幕在线观看2018 | www.xxx.性狂虐 | 国产午夜精品av一区二区 | 亚洲精品美女在线观看播放 | 久草在线综合 | 丰满少妇高潮在线观看 | 国产91亚洲精品 | 久草资源在线观看 | 国产在线观看一区 | 国产精品涩涩屋www在线观看 | 亚洲精品在线播放视频 | 开心丁香婷婷深爱五月 | 欧美a级在线播放 | 看污网站 | 91禁在线观看 | 中文字幕欧美激情 | 成人av中文字幕在线观看 | 色狠狠一区二区 | 丁香五婷| 久久视频这里只有精品 | 亚洲国产精彩中文乱码av | 麻豆成人小视频 | 欧美激情综合五月 | 麻豆视频在线免费看 | 黄色一级片视频 | 欧美精品一级视频 | www..com毛片 | 精品999国产| 免费h漫在线观看 | 国产精品久久婷婷六月丁香 | 天天射天天色天天干 | 在线视频 91 | 久久开心激情 | 天天翘av| 国产最新视频在线观看 | 中文字幕一区二 | 综合久久2023 | 国产精品成人久久久 | 日韩欧美成 | 日韩欧美一区二区三区在线 | 久久综合狠狠综合 | 精品一区二区在线免费观看 | 97超级碰碰碰视频在线观看 | 久久久久欧美精品999 | 夜夜骑日日操 | 精品亚洲成a人在线观看 | 国产日韩欧美在线观看视频 | 免费a一级| www免费看片com | 91av手机在线观看 | 精品久久久久久久久久久久 | 国产精品不卡av | 国产露脸91国语对白 | 久久99久久99精品免视看婷婷 | 国产精品12| 婷婷色伊人 | 午夜久久网站 | av中文字幕在线观看网站 | 麻豆国产精品va在线观看不卡 | 亚洲热久久 | 99久久精品视频免费 | 免费在线观看视频一区 | 丁香视频在线观看 | 久久久久久久99精品免费观看 | 999国产| 日韩欧美在线视频一区二区 | av免费观看高清 | 日韩av电影中文字幕 | 欧美一级艳片视频免费观看 | 96精品高清视频在线观看软件特色 | 国产夫妻av在线 | 黄色成人91 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国产一区二区电影在线观看 | 日本成人中文字幕在线观看 | 国产剧情一区 | 国产精品免费在线播放 | 天天操,夜夜操 | 久久综合九色 | 国产视频在线观看一区 | 人人草在线视频 | 亚洲成av人片在线观看www | 日韩精品播放 | av片子在线观看 | 免费高清男女打扑克视频 | 日韩av一区二区在线影视 | 日韩久久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美大片www | 97超碰资源站 | 天天天天天天天天操 | 99精品国产一区二区三区麻豆 | 97视频在线 | 久久精品久久久精品美女 | 国产精品美女久久久久久久久 | 91麻豆精品91久久久久同性 | 99久久久国产精品美女 | 日韩av电影手机在线观看 | 日日操日日 | 久久久亚洲精品 | 午夜视频在线观看一区二区三区 | 四虎国产 | 免费一级片观看 | 丁香5月婷婷久久 | 激情欧美一区二区免费视频 | 国产精品区一区 | 天天干天天射天天插 | 波多野结衣亚洲一区二区 | 日韩欧美高清免费 | 国产美女精品视频免费观看 | 免费亚洲电影 | 亚洲乱码精品久久久久 | 日韩在线视频不卡 | 国产成人精品福利 | 国产精品毛片久久久久久久 | 婷婷丁香在线视频 | 久久资源总站 | 欧美精品一区二区蜜臀亚洲 | 久久精品视频免费播放 | 日本三级中文字幕在线观看 | av中文字幕亚洲 | 97人人澡人人爽人人模亚洲 | 一本一本久久a久久精品综合小说 | 亚洲精品视频播放 | 毛片视频网址 | 国产91影院 | 91精品国产成人观看 | 国产又粗又猛又黄又爽 | 中文字幕在线播放av | 香蕉97视频观看在线观看 | 色综合中文综合网 | 超碰公开在线观看 | 五月宗合网| 激情小说 五月 | 国产成人av在线影院 | 亚洲精品高清视频在线观看 | 蜜臀精品久久久久久蜜臀 | 免费黄色av片 | 美女久久99 | 99免费在线播放99久久免费 | 麻豆av电影| 久久99精品国产麻豆宅宅 | 亚洲黄色小说网 | 亚洲成色777777在线观看影院 | 国产精品久久久久久久久久直播 | 国产精品美女久久 | 国产人成在线观看 | 中文字幕免费在线看 | 亚洲精品国产拍在线 | 在线免费色视频 | 亚洲欧美一区二区三区孕妇写真 | 91精品成人久久 | 99热最新网址| 4438全国亚洲精品在线观看视频 | 视频精品一区二区三区 | 色全色在线资源网 | 亚洲精品在线国产 | 欧美精品久久久久久久久老牛影院 | 亚洲一级影院 | 黄网av在线 | 手机看国产毛片 | 国产日韩欧美在线观看 | 天天综合网天天综合色 | 天天看天天干天天操 | 久久96国产精品久久99软件 | 午夜影院日本 | 欧美成人基地 | 99久久精品国产一区二区成人 | 超碰在线天天 | 婷婷久久丁香 | 狠狠干2018 | 久久香蕉国产 | 日本精品一区二区三区在线观看 | 久久精品福利视频 | 国产精品av在线免费观看 | 婷婷视频在线播放 | 五月婷婷在线视频观看 | 欧美激情综合五月色丁香 | 91免费版在线观看 | 免费高清在线视频一区· | 亚洲特级片 | 日韩毛片在线一区二区毛片 | 国产一区二区视频在线 | 99久久爱 | 欧美大片大全 | 天天干天天操 | 国产va在线观看免费 | 国产高清在线视频 | 国产福利电影网址 | 国产成人精品久久久久 | 日韩网站免费观看 | 黄色一及电影 | 亚洲高清视频在线播放 | 国产无套精品久久久久久 | 97超级碰碰碰碰久久久久 | 日本久久中文字幕 | a电影免费看 | 日韩在线字幕 | 久久影院午夜论 | 久久99精品久久久久久三级 | 超碰在线97国产 | 日本xxxxav| 欧美日韩天堂 | 欧美一区二区三区特黄 | 激情视频91 | 亚洲深爱激情 | 在线视频第一页 | 欧美99热 | 欧美精品一区二区三区四区在线 | av天天色| 99精品免费在线观看 | 在线观看视频在线 | av电影一区二区三区 | 69国产成人综合久久精品欧美 | 免费a v观看 | 又黄又刺激的视频 | 日日摸日日 | 中文字幕在线观看视频一区 | 色国产视频 | 国产精品一区二区av日韩在线 | 天天操天天操天天 | 视频在线一区二区三区 | 91精品久久久久久久久久久久久 | 国产美女永久免费 | www黄色com | 免费看在线看www777 | 国内精品视频免费 | 国产精品露脸在线 | 国产福利在线免费观看 | 久久久久福利视频 | 久久99精品波多结衣一区 | 色午夜 | 精品久久久久久久久久久院品网 | 亚洲va欧美 | 国产96av| 91九色国产视频 | 亚洲国产精品久久久久久 | 十八岁以下禁止观看的1000个网站 | 奇米7777狠狠狠琪琪视频 | 国产精品永久久久久久久www | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 久久99网 | 精品一区二区在线播放 | 久久精品视频4 | 久久久www成人免费精品 | 青青草国产成人99久久 | 国产资源av| 91麻豆文化传媒在线观看 | 久久视频二区 | 日日干av| 国产精品国产三级在线专区 | 中日韩免费视频 | 91精品爽啪蜜夜国产在线播放 | 精品视频9999 | 色综合天天狠天天透天天伊人 | 91精品国产三级a在线观看 | 国内视频在线 | 精品视频99| 国产美女免费视频 | 日韩精品免费一线在线观看 | 午夜精品一区二区三区免费 | 九色精品免费永久在线 | 成年人免费观看国产 | 欧美一级特黄高清视频 | 国产精品日韩久久久久 | 日日干夜夜干 | 日韩精品欧美一区 | av福利网址导航 | 久久影院一区 | 国产在线不卡一区 | 最近中文字幕mv免费高清在线 | 欧美日韩18 | 日韩视 | 天天射天天| av片子在线观看 | 天天综合日日夜夜 | 国产成人精品电影久久久 | 69国产精品成人在线播放 | 欧美激情综合五月色丁香 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久99热这里只有精品 | 天天操人 | 日韩一级黄色av | 午夜久久影视 | 国产精品一区二区av影院萌芽 | 中文字幕在线观看三区 | 欧美色图一区 | 亚洲精品九九 | 中文字幕2021| 亚洲精品乱码白浆高清久久久久久 | 九九久久久久久久久激情 | 国产精品久久毛片 | 久久久免费看视频 | 在线免费三级 | av一本久道久久波多野结衣 | 蜜臀aⅴ国产精品久久久国产 | 亚洲国产三级 | 午夜精品av | 中文字幕a∨在线乱码免费看 | 久久精品超碰 | 99视频免费 | 狠狠狠色丁香婷婷综合久久88 | 日韩欧美在线不卡 | 黄色的片子 | 亚洲精品国产麻豆 | 91原创在线观看 | 久久综合九色99 | 西西44人体做爰大胆视频 | 99久久精品免费看国产一区二区三区 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产一区二区免费看 | 香蕉影视在线观看 | 久久影院中文字幕 | 又黄又爽免费视频 | 亚洲男男gaygayxxxgv | 日韩在线国产精品 | 精品91视频 | 日韩午夜在线观看 | 日日碰夜夜爽 | 最近中文字幕国语免费av | 国产精品免费久久久 | 91在线日韩| 激情影院在线 | 在线观看午夜av | 免费成人黄色 | 久久国产成人午夜av影院宅 | 中文字幕黄色网 | 亚洲免费av一区二区 | 成人久久久久久久久久 | 婷婷丁香av | 玖玖玖在线观看 | 久久久久久久久久久久电影 | 成人羞羞免费 | 国产最顶级的黄色片在线免费观看 | 久久精品国产免费 | 韩国一区二区三区视频 | 国产在线97 | 国产在线精品观看 | 久久久久区 | 久久不卡电影 | 亚洲乱码精品久久久 | 伊人五月 | av福利在线看 | 欧美日韩在线观看一区 | 国产理论影院 | 波多野结衣在线播放视频 | 丁香婷婷在线 | 99精品在这里 | 免费看国产a | 美女黄频在线观看 | av免费线看 | 黄色软件在线观看免费 | 亚洲欧美日韩中文在线 | 久久男人影院 | 天天天天干 | 中文字幕一区三区 | 亚洲第一久久久 | 日韩大片免费观看 | 久久草在线免费 | 久久草在线免费 | 91九色pron| 国产69久久久 | 粉嫩一二三区 | 99国内精品久久久久久久 | 中文字幕日韩伦理 | 久久久久久久久久久黄色 | 四虎www. | 日韩特黄一级欧美毛片特黄 | 黄网站色| 九九热国产视频 | 色婷婷影视| 国产最新网站 | 成人高清在线 | www.精选视频.com| 中文字幕在线免费播放 | 色婷婷亚洲精品 | 欧美日韩国产精品久久 | 在线观看中文字幕亚洲 | 成人av一区二区兰花在线播放 | 日韩高清一区二区 | 久久久视频在线 | .国产精品成人自产拍在线观看6 | 丁香婷婷自拍 | 久久黄色小说视频 | 六月婷操 | 久久看片网站 | 色综合久久88色综合天天人守婷 | 成人黄色片在线播放 | 中文字幕第 | 色综合在 | 日韩大片免费在线观看 | 中文字幕制服丝袜av久久 | 亚洲成人欧美 | 最近中文字幕大全中文字幕免费 | 中文国产字幕在线观看 | 成人毛片一区 | av丝袜在线 | 久久国内精品99久久6app | 免费高清男女打扑克视频 | 又黄又爽又无遮挡的视频 | 99色在线视频 | 亚洲国产日韩欧美在线 | 在线视频你懂得 | 西西www4444大胆在线 | 中文字幕丰满人伦在线 | 日韩黄色一级电影 | 91探花视频| 99热999 | 91九色丨porny丨丰满6 | 亚洲理论电影 | 日韩精品视频在线观看免费 | 亚洲资源 | 天天撸夜夜操 | 懂色av一区二区在线播放 | 午夜在线免费观看视频 | 黄色软件大全网站 | 久久久精品电影 | 国产五月 | av黄免费看 | 伊人视频 | 久精品视频在线 | 国产美女在线精品免费观看 | 在线观看色网 | 九色91福利| 日本精品在线视频 | 一级片视频在线 | 日韩一级网站 | 成人综合婷婷国产精品久久免费 | 天天操天天干天天爱 | 亚洲涩涩涩 | 午夜久草 | 中文在线字幕免费观看 | 精品久操| 国产精品综合久久久久久 | 日韩精品久久久久久久电影竹菊 | 久久久久久久久网站 | 国产91精品一区二区麻豆亚洲 | 国产在线色视频 | 97在线观看免费高清 | 亚洲精品女人久久久 | 中文在线免费看视频 | 四虎影视8848dvd | 久久国产欧美日韩 | 国产黄色片免费看 | 婷婷色六月天 | 国产分类视频 | 精品国产乱码久久久久 | 国产精品久久久久久久久久久久午夜片 | 久久成人免费电影 | 久久99九九99精品 | 免费网站看av片 | 97色婷婷成人综合在线观看 | 日韩高清免费电影 | 91精品久久久久 | 久久久久久久久久久久久久av | av黄色在线观看 | 欧美精品乱码99久久影院 | 夜夜夜草 | 欧美aⅴ在线观看 | 日韩精品免费在线观看 | 亚洲国产精品成人精品 | 97超级碰碰碰视频在线观看 | 欧洲亚洲女同hd | 成人不用播放器 | 69xx视频 | 欧美一级大片在线观看 | 一级片免费视频 | 婷婷六月丁 | 久久,天天综合 | 福利网址在线观看 | 日本精品一区二区三区在线播放视频 | 国产激情电影综合在线看 | 在线观看精品视频 | 成人手机在线视频 | 国产亚洲午夜高清国产拍精品 | 中文字幕人成人 | 婷婷色六月天 | 免费在线观看av网站 | 伊人手机在线 | 国产亚洲欧美一区 | 乱男乱女www7788 | 中日韩在线 | 99视频在线免费看 | 国产专区精品视频 | 九九视频在线观看视频6 | 丁香色婷 | 久久艹在线观看 | 国产精品久久久久久久久婷婷 | 亚洲欧洲一区二区在线观看 | 国产精品久久久久久久久久久久午 | 91成人免费视频 | 高清不卡毛片 | 精品国产一区二区在线 | 成x99人av在线www | 亚洲一一在线 | 中文字幕中文字幕在线中文字幕三区 | 久久精品美女视频网站 | 国产97色在线 | 在线观看免费一级片 | 亚洲福利精品 | 久久久久夜色 | 久久婷婷精品视频 | 久久99热精品这里久久精品 | 日韩一区二区三区免费视频 | 欧美国产一区二区 | 久久视频网址 | 综合网伊人 | 日韩免费网站 | 欧美日韩精品在线免费观看 | 五月天激情综合 | 国产成人免费观看久久久 | av免费在线观 | 九九免费在线观看视频 | 欧美大香线蕉线伊人久久 | 国产探花在线看 | 国产精品123 | 日韩va欧美va亚洲va久久 | 黄色亚洲| 狠狠色丁香婷综合久久 | 精品在线免费视频 | 91丨九色丨高潮丰满 | 日日夜夜爱| 麻豆视频网址 | 国产精品女教师 | 久久久久久久久久久久久久免费看 | 日韩精品在线视频免费观看 | 日韩免费一级电影 | 五月天天天操 | 婷婷激情5月天 | 玖玖精品在线 | 欧美日韩免费在线视频 | 欧美在线视频一区二区三区 | 久久国产手机看片 | 日韩高清在线一区二区 | 狠狠插狠狠干 | 国产精品视频99 | 免费观看第二部31集 | 亚洲高清91 | 91精品国产92久久久久 | 成人黄色小说在线观看 | 国产精品21区 | 日韩在线色视频 | 亚洲精品国| 色午夜 | 久99视频| 99热这里是精品 | 国产精品视频在线观看 | 欧美综合色在线图区 | av免费观看在线 | 亚洲国产精品成人女人久久 | 欧美91精品久久久久国产性生爱 | www.天天射.com | 久久一区二区三区日韩 | 久久激情小说 | 91在线免费公开视频 | 欧美午夜一区二区福利视频 | 人人狠狠综合久久亚洲 | 国产毛片在线 | 成人午夜电影免费在线观看 | 婷婷丁香激情网 | 久久久国产视频 |