Nginx原始碼分析 connections陣列

2021-05-23 17:21:06 字數 1031 閱讀 1078

本文的標題讓我糾結了好久,不知道是connections陣列合適,還是connections鍊錶更合適;nginx在此或多或少的注入了二者的特點,先不管是叫陣列還是叫鍊錶吧,只要能夠弄明白這個connections是怎麼回事就大功告成。nginx的每個worker程序都使用乙個相同的connections陣列來維護每個連線。當有乙個新的連線建立時,nginx需要從這個陣列取出乙個slot來存放這個連線;相反,有乙個連線斷開時,也需要將相應的slot歸還給connections陣列。本文就來看一下這個connections陣列是如何構造的,能夠讓nginx方便,快速的獲取/釋放乙個slot。我從ngx_event_process_init()函式中拼湊了如下一段**:

經過上述**過後,形成的資料結構如下圖所示:

現在,nginx已經為我們構造起了乙個空的connections陣列,我們需要建立乙個新的連線,因此呼叫函式ngx_get_connection()從connections陣列中獲取乙個可用的slot來維護這個連線。首先,我們看一下ngx_get_connection()函式的簡化實現:

從剛建立的connections陣列中獲取乙個slot後的,效果圖如下:

在上述狀態下,我們再獲取乙個slot,那麼就得到如下的結果了:

到此,我們基本明白從connections陣列中獲取乙個slot的操作過程了,接下來看看釋放乙個slot的過程是如何的。和ngx_get_connection()函式對應的是ngx_free_connection()函式。簡化實現如下:

釋放第一次獲取的slot後的效果如下:

再釋放第二次獲取的slot後,又變成如下的效果了:

雖然最後整個connections陣列都沒有被使用,但和起初建立好的時候,還是有一定的區別的。但最重要的是——所有可以使用的slot都還是照樣在乙個鍊錶上,只是slot的串聯順序不一樣了。本文只是給出了一種很簡單很簡單的獲取釋放slot的case。你完全可以異想天開的獲取釋放slot的順序,構造出看上去比較複雜的乙個鍊錶,但本質始終還是一樣的。

乙個好的資料結構,不光要高效,還得易用,nginx在這個connection維護方面,做到了。

nginx 原始碼分析

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

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

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

Nginx原始碼分析 簡介

nginx 是俄羅斯人編寫的十分輕量級的 http 伺服器,nginx,它的發音為 engine x 是乙個高效能的http和反向 伺服器,同時也是乙個 imap pop3 smtp 伺服器。nginx 以事件驅動的方式編寫,所以有非常好的效能,同時也是乙個非常高效的反向 負載平衡。其擁有匹配 li...