Nginx学习笔记---ngx_buf_t数据结构
生活随笔
收集整理的這篇文章主要介紹了
Nginx学习笔记---ngx_buf_t数据结构
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
typedef struct ngx_buf_s ngx_buf_t;
typedef void *ngx_buf_tag_t;
struct ngx_buf_s {/** pos通常是用來(lái)告訴使用者本次應(yīng)該從pos這個(gè)位置開(kāi)始處理內(nèi)存中的數(shù)據(jù),這樣設(shè)置是因?yàn)橥粋€(gè)* ngx_buf_t可能被多次反復(fù)處理。當(dāng)然,pos的含義是由使用它的模板定義的*/u_char *pos;/* last通常表示有效的內(nèi)容到此為止,注意,pos與last之間的內(nèi)存是希望nginx處理的內(nèi)容 */u_char *last;/** 處理文件時(shí),file_pos與file_last的含義與處理內(nèi)存時(shí)的pos與last相同,* file_pos表示將要處理的文件位置,file_last表示截至的文件位置。*/off_t file_pos;off_t file_last;/* 如果ngx_buf_t緩沖區(qū)用于內(nèi)存,那么start指向這段內(nèi)存的起始地址 */u_char *start;/* 與start成員對(duì)應(yīng),指向緩沖區(qū)內(nèi)存的末尾 */u_char *end;/* 表示當(dāng)前緩沖區(qū)的類(lèi)型,例如由哪個(gè)模塊使用就指向這個(gè)模塊ngx_module_t變量的地址 */ngx_buf_tag_t tag;/* 引用的文件 */ngx_file_t *file;/** 當(dāng)前緩沖區(qū)的影子緩沖區(qū),該成員很少用到。當(dāng)緩沖區(qū)轉(zhuǎn)發(fā)上游服務(wù)器的響應(yīng)時(shí)才使用了shadow成員,* 這是因?yàn)閚ginx太節(jié)約內(nèi)存了,分配一塊內(nèi)存并使用ngx_buf_t表示接收到的上游服務(wù)器響應(yīng)后,* 在向下游客戶端轉(zhuǎn)發(fā)時(shí)可能會(huì)把這塊內(nèi)存存儲(chǔ)到文件中,也可能直接向下游發(fā)送,此時(shí)nginx絕對(duì)不會(huì)* 重新復(fù)制一份內(nèi)存用于新的目的,而是再次建立一個(gè)ngx_buf_t結(jié)構(gòu)體指向原內(nèi)存,這樣多個(gè)ngx_buf_t* 結(jié)構(gòu)體指向了同一份內(nèi)存,它們之間的關(guān)系就通過(guò)shadow成員來(lái)引用,一般不建議使用。*/ngx_buf_t *shadow;/* 臨時(shí)內(nèi)存標(biāo)志位,為1時(shí)表示數(shù)據(jù)在內(nèi)存中且這段內(nèi)存可以修改 */unsigned temporay:1;/* 標(biāo)志位,為1時(shí)表示數(shù)據(jù)在內(nèi)存中且這段內(nèi)存不可以修改 */unsigned memory:1;/* 標(biāo)志位,為1時(shí)表示這段內(nèi)存是用nmap系統(tǒng)調(diào)用映射過(guò)來(lái)的,不可以修改 */unsigned mmap:1;/* 標(biāo)志位,為1時(shí)表示可回收 */unsigned recycled:1;/* 標(biāo)志位,為1時(shí)表示這段緩沖區(qū)處理的是文件而不是內(nèi)存 */unsigned in_file:1;/* 標(biāo)志位,為1時(shí)表示需要執(zhí)行flush操作 */unsigned flush:1;/** 標(biāo)志位,對(duì)于操作這塊緩沖區(qū)時(shí)是否使用同步方式,需謹(jǐn)慎考慮,這可能會(huì)阻塞nginx進(jìn)程,nginx中所有* 操作幾乎都是異步的,這是它支持高并發(fā)的關(guān)鍵。有些框架代碼在sync為1時(shí)可能會(huì)有阻塞的方式進(jìn)行I/O* 操作,它的意義視使用它的nginx模塊而定。*/unsigned sync:1;/** 標(biāo)志位,表示是否是最后一塊緩沖區(qū),因?yàn)閚gx_buf_t可以由ngx_chain_t鏈表串聯(lián)起來(lái),因此為1時(shí),* 表示當(dāng)前是最后一塊待處理的緩沖區(qū)。 */unsigned last_buf:1;/* 標(biāo)志位,表示是否是ngx_chain_t中的最后一塊緩沖區(qū) */unsigned last_in_chain:1;/* 標(biāo)志位,表示是否是最后一個(gè)影子緩沖區(qū),與shadow域配合使用。通常不建議使用它 */unsigned last_shadow:1;/* 標(biāo)志位,表示當(dāng)前緩沖區(qū)是否屬于臨時(shí)文件 */unsigned temp_file:1;
}
緩沖區(qū)ngx_buf_t是nginx處理大數(shù)據(jù)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),它既應(yīng)用于內(nèi)存數(shù)據(jù)也應(yīng)用于磁盤(pán)數(shù)據(jù)。
buf指向當(dāng)前的ngx_buf_t緩沖區(qū),next則用來(lái)指向于下一個(gè)ngx_chain_t。如果這是最后一個(gè)ngx_chain_t,則需要把next置為NULL。
在向用戶發(fā)送HTTP包體時(shí),就要傳入ngx_chain_t鏈表對(duì)象,注意,如果是最后一個(gè)ngx_chain_t,那么必須將next置為NULL,否則永遠(yuǎn)不會(huì)發(fā)送成功,而且這個(gè)請(qǐng)求將一直不會(huì)結(jié)束。
轉(zhuǎn)載于:https://blog.51cto.com/sofar/1327728
總結(jié)
以上是生活随笔為你收集整理的Nginx学习笔记---ngx_buf_t数据结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在列表中添加序号列
- 下一篇: Nginx学习之六:Nginx配置操作导