Nginx單向鏈表 ngx_list_t

目錄

基本概述

數據結構

接口描述

具體實現

ngx_list_create

ngx_list_init

ngx_list_push

使用案例


整理自?nginx?1.9.2 源碼 和 《深入理解 Nginx:模塊開發與架構解析》

基本概述

????????Nginx 中的 ngx_list_t 是一個單向鏈表容器,鏈表中的每一個節點同時又是數據數組。ngx_list_t 作為鏈表容器,確定了 ngx_list_part_s 節點的存儲空間容量、內存管理入口(內存池)和數據訪問入口(鏈表+數組)。

????????ngx_list_t? 鏈表具體結構如下圖所示。可靈活定義 ngx_list_part_s 中數據結構,同時因為其內部存儲地址連續,可通過數組偏移進行快速訪問。

數據結構

typedef struct ngx_list_part_s  ngx_list_part_t; /*鏈表中的一個節點,該節點中的 elts 記錄一個數組的數據,數組類型可以自定義 ;節點使用的數組,容量(成員個數)已經固定(由 ngx_list_t 中的 nalloc 確定),使用 nelts 記錄該數組已使用容量,所以 nelts 肯定小于 nalloc
*/
struct ngx_list_part_s { void             *elts;   // 指向數組的起始地址。ngx_uint_t        nelts;  // 數組已使用了多少個元素ngx_list_part_t  *next;   // 下一個鏈表節點
};/*ngx_list_part_s 鏈表容器,該結構體內確定了 ngx_list_part_s 的存儲空間容量、內存管理入口和訪問入口。
*/
typedef struct { ngx_list_part_t  *last;  //指向鏈表的最后一個節點。ngx_list_part_t   part;  //鏈表的首個數組節點。// 限制 ngx_list_part_s elts 中每個數組元素的占用空間的大小size_t            size;  // 限制 ngx_list_part_s elts 中每個數組最大元素數量,一旦分配后是不可更改的ngx_uint_t        nalloc;// //鏈表中管理內存分配的內存池對象。用戶要存放的數據占用的內存都是由 pool 分配的。ngx_pool_t       *pool;  
} ngx_list_t;

接口描述

// 創建新的鏈表,指定內存池對象,和數組容量(元素個數和每個元素大小)
// 該函數調用后會返回一個鏈表,該鏈表內至少有一個數組,不會是空鏈表的
ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size);// 初始化已有鏈表,與 ngx_list_create 使用方法相似,其實 ngx_list_create 里面也會調用 ngx_list_init
static ngx_inline ngx_int_t
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)// 往鏈表中新增元素,傳入鏈表,返回新元素的首地址供使用。注意此時返回的是 ngx_list_part_s 中的 elts 成員
void *ngx_list_push(ngx_list_t *list);

具體實現

ngx_list_create

ngx_list_t *
ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size) //實際上就是為nginx_list_t的part成員創建指定的n*size空間,并且創建了空間sizeof(ngx_list_t)
{ngx_list_t  *list;// 分配 ngx_list_t 大小的內存list = ngx_palloc(pool, sizeof(ngx_list_t));if (list == NULL) {return NULL;}// 對空鏈表進行初始化if (ngx_list_init(list, pool, n, size) != NGX_OK) {return NULL;}return list;
}

ngx_list_init

static ngx_inline ngx_int_t
ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{// 對鏈表的首個 ngx_list_part_s 元素中的數組分配內存,大小為 n * size,n 為數組元素個數,size 為數組內每個元素的大小,我們可以看到,這些配置在鏈表初始化的時候就已經寫死了,不可再改變,除非再次初始化list->part.elts = ngx_palloc(pool, n * size); if (list->part.elts == NULL) {return NGX_ERROR;}// 對鏈表的一些屬性進行賦值list->part.nelts = 0;list->part.next = NULL;// 初始化時,鏈表只有一個節點,所以首節點也是末尾節點list->last = &list->part;list->size = size;list->nalloc = n;list->pool = pool;return NGX_OK;
}

ngx_list_push

// 往鏈表的末尾節點中新增數組,函數返回可用地址指針
void *
ngx_list_push(ngx_list_t *l)
{void             *elt;ngx_list_part_t  *last;last = l->last;// 判斷末尾節點的數組空間是否滿了if (last->nelts == l->nalloc) {/* the last part is full, allocate a new list part */// 若末尾節點空間滿了,則往鏈表中新增節點,刷新末尾節點地址last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));if (last == NULL) {return NULL;}last->elts = ngx_palloc(l->pool, l->nalloc * l->size);if (last->elts == NULL) {return 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;
}

使用案例

// 創建一個鏈表,鏈表中每個數組長度限制為 4,每個數組元素數據類型為 ngx_str_t
// 創建鏈表的時候,內部會調用 ngx_list_init
ngx_list_t* testlist = ngx_list_create(r->pool, 4, sizeof(ngx_str_t));
if (testlist == null )
{return NGX_ERORR;
}// 往鏈表中添加數據,該數據會添加到鏈表末尾節點的數組中,若該數組剩余容量不足,會往鏈表中新增節點
ngx_str_t* str = ngx_list_push(testlist);
if ( str == null )
{return NGX_ERROR;
}
str->len = sizeof("hello world");
str->value = "he11o world";// 遍歷鏈表
// part 用于指向鏈表中的每一個 ngx_list_part_t 數組,剛開始執行鏈表中第一個節點
ngx_list_part_t* part = &testlist.part;
//根據鏈表中的數據類型,把數組里的 elts 轉化為該類型使用
ngx_str_t* str = part->elts;
// i 表示元素在鏈表的每個 ngx_list_part_t 數組里的序號
for (i ; 0; /* void */; i++)
{// 如果數組已使用的數組元素已經遍歷完,則需要跳轉到鏈表中下一個節點if ( i >= part->nelts ){if ( part -> next == NULL ){// 如果某個 ngx_list_part_t 數組的 next 指針為空// 則說明已經遍歷完鏈表了break;}// 訪問下一個 ngx_list_part_tpart = part->next;header = part->elts;// 將 i 序號置為 0,準備重新訪問下一個數組i = 0;}// 遍歷每個鏈表節點數組內的元素printf("list element : %*s\n", str[i].len, str[i].data);
}

------------------------------------以下為廢話,不需要再閱讀------------------------------------------

NGINX是一款高性能的HTTP服務器和反向代理服務器,它以其穩定性、豐富的功能集、以及輕量級架構而聞名。在互聯網技術棧中,NGINX扮演著至關重要的角色,廣泛應用于負載均衡、靜態內容服務以及作為反向代理來提高應用的可用性和擴展性。它的事件驅動架構使其能夠支持高并發連接,處理大量請求而不顯著增加延遲。

NGINX的配置文件采用簡潔明了的語法,使得用戶可以輕松地進行性能調優和功能定制。通過模塊化設計,NGINX不僅支持HTTP/2協議,還提供了對TLS/SSL的全面支持,確保數據傳輸的安全性。此外,它還具備WebSocket支持,使得實時通信應用能夠無縫運行。

NGINX的反向代理能力尤為突出,它可以根據URL路徑、頭部信息等多種規則將客戶端請求智能地轉發到后端服務器群中的某一臺或多臺服務器上,實現請求的高效分發。同時,NGINX還支持健康檢查機制,能夠自動剔除故障節點,保證服務的高可用性。

對于靜態內容的高效處理也是NGINX的一大亮點。它可以快速響應并交付HTML頁面、圖片、CSS文件等靜態資源,極大地提升了網站訪問速度。結合其緩存機制,NGINX能有效減輕后端服務器的壓力,優化整體系統性能。

NGINX還提供了豐富的第三方模塊,如安全防護、流量控制等,進一步增強了其功能性。無論是小型網站還是大型企業級應用,NGINX都能提供靈活且強大的解決方案,是現代Web架構中不可或缺的組成部分。

NGINX是一款高性能的HTTP服務器和反向代理服務器,它以其穩定性、豐富的功能集、以及輕量級架構而聞名。在互聯網技術棧中,NGINX扮演著至關重要的角色,廣泛應用于負載均衡、靜態內容服務以及作為反向代理來提高應用的可用性和擴展性。它的事件驅動架構使其能夠支持高并發連接,處理大量請求而不顯著增加延遲。

NGINX的配置文件采用簡潔明了的語法,使得用戶可以輕松地進行性能調優和功能定制。通過模塊化設計,NGINX不僅支持HTTP/2協議,還提供了對TLS/SSL的全面支持,確保數據傳輸的安全性。此外,它還具備WebSocket支持,使得實時通信應用能夠無縫運行。

NGINX的反向代理能力尤為突出,它可以根據URL路徑、頭部信息等多種規則將客戶端請求智能地轉發到后端服務器群中的某一臺或多臺服務器上,實現請求的高效分發。同時,NGINX還支持健康檢查機制,能夠自動剔除故障節點,保證服務的高可用性。

對于靜態內容的高效處理也是NGINX的一大亮點。它可以快速響應并交付HTML頁面、圖片、CSS文件等靜態資源,極大地提升了網站訪問速度。結合其緩存機制,NGINX能有效減輕后端服務器的壓力,優化整體系統性能。

NGINX還提供了豐富的第三方模塊,如安全防護、流量控制等,進一步增強了其功能性。無論是小型網站還是大型企業級應用,NGINX都能提供靈活且強大的解決方案,是現代Web架構中不可或缺的組成部分。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64070.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

es快速掃描

介紹 Elasticsearch簡稱es,一款開源的分布式全文檢索引擎 可組建一套上百臺的服務器集群,處理PB級別數據 可滿足近實時的存儲和檢索 倒排索引 跟正排索引相對,正排索引是根據id進行索引,所以查詢效率非常高,但是模糊…

軟件需求建模方法

軟件需求建模是一個涉及多個學科的領域,其研究方向廣泛且多樣。以下是一些主要的研究方向: 1. 需求工程方法:研究如何更有效地收集、分析、規格化和驗證軟件需求。這包括新的需求工程方法論和工具的開發。 2. 需求管理:關注需求…

軟件項目需求分析的實踐探索(1)

一、項目啟動與規劃 組建團隊 包括項目經理、系統分析師、業務分析師以及可能涉及的最終用戶代表和領域專家等。例如,開發一個醫療管理軟件,就需要有醫療行業的專家參與,確保對醫療業務流程有深入理解。明確各成員的職責,如系統分…

wordpres當前分類調用父分類的名稱和鏈接

在WordPress中&#xff0c;如果你想在當前分類頁面調用并顯示父分類的名稱和鏈接&#xff0c;你可以使用以下代碼片段&#xff1a; <?php // 獲取當前分類的ID $cat_id get_queried_object_id();// 獲取當前分類的父分類ID $parent_id get_term($cat_id, category)->…

前端Python應用指南(三)Django vs Flask:哪種框架適合構建你的下一個Web應用?

《寫給前端的python應用指南》系列&#xff1a; &#xff08;一&#xff09;快速構建 Web 服務器 - Flask vs Node.js 對比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的應用結構與模塊化設計 在上一篇博文中&#xff0c;我們深入探討了Flask框架&#xff0c;…

網絡管理-期末項目(附源碼)

環境&#xff1a;網絡管理 主機資源監控系統項目搭建 &#xff08;保姆級教程 建議點贊 收藏&#xff09;_搭建網絡版信息管理系統-CSDN博客 效果圖 下面3個文件的項目目錄(python3.8.8的虛擬環境) D:\py_siqintu\myproject5\Scripts\mytest.py D:\py_siqintu\myproject5\Sc…

MySQL 常用程序介紹

以下是一些常用的MySQL程序&#xff1a; 程序名作?mysqldMySQL的守護進程即 MySQL 服務器&#xff0c;要使?MySQL 服務器 mysqld必須正在運?狀態mysql MySQL客?端程序&#xff0c;?于交互式輸? SQL 語句或以批處理模式從?件執?SQL的命令??具 mysqlcheck?于檢查、修…

Redis篇--常見問題篇4--大Key(Big Key,什么是大Key,影響及使用建議)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的長度非常大&#xff0c;實際上鍵&#xff08;Key&#xff09;長度很大也算。通常來說&#xff0c;鍵本身不會很長&#xff0c;占用的內存較少&#xff0c;因此判斷一個鍵是否為bigKey主要看它對應的值的大…

云手機+YouTube:改變通信世界的劃時代技術

隨著科技的不斷進步&#xff0c;手機作為人們生活中不可或缺的工具&#xff0c;也在不斷地更新換代。近年來&#xff0c;一個名為“油管云手機”的全新產品正在引起廣泛的關注和討論。作為一個運用最新科技實現的新型手機&#xff0c;它在通信領域帶來了全新的體驗和革命性的變…

ModbusTCP從站轉Profinet主站案例

一. 案例背景 在復雜的工業自動化場景中&#xff0c;企業常常會采用不同品牌的設備來構建生產系統。西門子SINAMICS G120變頻器以其高性能、高精度的速度和轉矩控制功能&#xff0c;在電機驅動領域應用廣泛。施耐德M580可編程邏輯控制器則以強大的邏輯控制和數據處理能力著稱&…

JS 函數的定義與調用

文章目錄 1. 普通函數-無形參2. 普通函數-有形參3. 普通函數-參數默認值4. 普通函數-返回值5. 立即執行函數6. 匿名函數7. 箭頭函數8. 函數提升 1. 普通函數-無形參 函數定義時沒有指定形參, 調用時仍然可以向其傳遞參數, 通過默認參數 arguments 獲取, arguments 是一個偽數組…

MySQL的索引失效的原因有那些

1. 數據類型不匹配 詳細說明&#xff1a;MySQL在比較不同數據類型的值時&#xff0c;可能會嘗試進行隱式轉換。如果這種轉換導致了復雜度增加或無法直接利用索引&#xff0c;則會導致索引失效。 實例與解決方案&#xff1a; -- 錯誤示例&#xff1a;數據類型不匹配 select *…

邁向未來:.NET技術的持續創新與發展前景

隨著信息技術的飛速發展&#xff0c;編程語言和開發框架不斷涌現&#xff0c;許多技術平臺以其獨特的優勢贏得了開發者的青睞。在這場技術的競爭中&#xff0c;.NET平臺憑借其卓越的性能、廣泛的生態系統以及持續創新的精神&#xff0c;成為了全球開發者的重要選擇。本文將探討…

微信小程序-基于Vant Weapp UI 組件庫的Area 省市區選擇

Area 省市區選擇&#xff0c;省市區選擇組件通常與 彈出層 組件配合使用。 areaList 格式 areaList 為對象結構&#xff0c;包含 province_list、city_list、county_list 三個 key。 每項以地區碼作為 key&#xff0c;省市區名字作為 value。地區碼為 6 位數字&#xff0c;前兩…

Canvas指定三角形內部生成隨機點

使用重心坐標&#xff08;barycentric coordinates&#xff09;或者通過面積比例的方法來確定點是否在三角形內。不過&#xff0c;對于簡單的應用&#xff0c;一種常見的方法是使用隨機點并檢查它們是否在三角形內部。如果不在&#xff0c;就重新生成&#xff0c;直到得到足夠數…

智駕感知「大破局」!新一輪混戰開啟

隨著智能駕駛搭載率的攀升&#xff0c;艙外傳感器賽道迎來新變局。 一方面&#xff0c;從近幾年智駕傳感器的配置變化來看&#xff0c;攝像頭的主導地位顯而易見。 12月10-12日&#xff0c;由德賽西威總冠名的2024&#xff08;第八屆&#xff09;高工智能汽車年會暨年度金球獎…

深入解析Android Recovery系統

深入解析Android Recovery系統 引言 在Android系統中,Recovery模式是一個非常重要的組成部分。它主要用于系統的恢復、更新和修復。當用戶遇到系統問題時,Recovery模式可以提供一種安全的方式來恢復系統到正常狀態。本文將深入探討Android Recovery系統的實現原理,重點分析…

Kibana8.17.0在mac上的安裝

1、Kibana是什么 Kibana是與elasticsearch配套使用的數據分析與可視化工具&#xff0c;通過Kibana可以輕松與es中存儲的數據進行高效的交互&#xff0c;包括數據寫入、檢索、刪除等操作&#xff0c;并可以通過編寫部分代碼將數據做成各種報表&#xff0c;從而進行非常直觀的統…

數字IC后端設計實現十大精華主題分享

今天小編給大家分享下吾愛IC社區星球上周十大后端精華主題。 Q1:星主&#xff0c;請教個問題&#xff0c;長tree的時候發現這個scan的tree 的skew差不多400p&#xff0c;我高亮了整個tree的schematic&#xff0c;我在想是不是我在這一系列mux前邊打斷&#xff0c;設置ignore p…

給bmp和png,設置BLENDFUNCTION的AlphaFormat不同參數的效果

BLENDFUNCTION是AlphaBlend用控制透明效果的重要參數。 選擇一個32位的png圖片&#xff0c;設置AlphaFormat 為 AC_SRC_ALPHA&#xff0c;效果如上圖。 選擇一個32位的png圖片&#xff0c;設置AlphaFormat 為 0&#xff0c;效果如上圖。 選擇一個24位的bmp圖片&#xff0c;設置…