Time of Update: 2018-12-03
逾時重傳是TCP協議保證資料可靠性的另一個重要機制,其原理是在發送某一個資料以後就開啟一個計時器,在一定時間內如果沒有得到發送的資料報的ACK報文,那麼就重新發送資料,直到發送成功為止。1.逾時逾時時間的計算是逾時的核心部分,TCP要求這個演算法能大致估計出當前的網路狀況,雖然這確實很困難。要求精確的原因有兩個:(1)定時間長度久會造成網路利用率不高。(2)定時太短會造成多次重傳,使得網路阻塞。所以,書中給出了一套經驗公式,和其他的保證計時器準確的措施。1.1.遞推公式概說最早的TCP曾經用了一
Time of Update: 2018-12-03
引用與指標的區別: 常常有人問引用與指標的區別,可能是指標和引用在功能上的相似,而是他們混淆這兩個概念, 現在總結以下二者的區別,希望大家能徹底弄清這兩個概念根本性的差別: 引用,一個變數的別名,為什麼引入別名呢?原因是我們想定義一個變數,他共用另一個變數的 記憶體空間,使用別名無疑是一個好的選擇。變數是什嗎?是一個記憶體空間的名字,如果我們給這個 記憶體空間在起另外一個名字,那就是能夠共用這個記憶體了,引用(別名)的由此而來。
Time of Update: 2018-12-03
在QT中,有一個工具qmake可以產生一個makefile檔案,它是由.pro檔案產生而來的,.pro檔案的寫法如下:1. 注釋從“#”開始,到這一行結束。2. 指定源檔案SOURCES = *.cpp對於多源檔案,可用空格分開,如:SOURCES = 1.cpp 2.cpp3.cpp或者每一個檔案可以被列在一個分開的行裡面,通過反斜線另起一行,就像這樣:SOURCES = hello.cpp main.cpp一個更冗長的方法是單獨地列出每一個檔案,就像這樣:
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! 本文的標題讓我糾結了好久,不知道是connections數組合適,還是connections鏈表更合適;Nginx在此或多或少的注入了二者的特點,先不管是叫數組還是叫鏈表吧,只要能夠弄明白這個connections是怎麼回事就大功告成。Nginx的每個worker進程都使用一個相同的connections數組來維護每個串連。當有一個新的串連建立時,Nginx需要從這個數組取出一個slot來存放這個串連;相反,有一個串連斷開時,也需要將相應的s
Time of Update: 2018-12-03
前面已經分析了nginx的事件處理機制的構建階段,也分析過nginx的進程模型,利用上一篇文章中總結的並行存取模型設計的知識,先總結介紹一下nginx的並行存取模型,然後剖析nginx事件處理機制運行階段的處理過程。nginx的進程模型採用的是prefork方式,預先分配的worker子進程數量由設定檔指定,預設為1。master主進程建立監聽套介面並監聽客戶串連,每個worker子進程獨自accept已串連套介面,accept是否上鎖可以配置,預設會上鎖,如果作業系統支援原子整型,才會使用共
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! Nginx源碼之中有著很多很多的結構,當然每一個結構都是非常重要的,本文將分析其中的4個結構之間的關係。這4個結構分別是:listening、connection、event以及request。下面用一個圖形來展現他們之間的關係: 4個結構都被省略了絕大多數的欄位,僅僅留下來他們之間互相關聯的一個或幾個欄位。從他們分別指向的結構,可以看出每個指標各自的類型;只有ngx_connection_t和ngx_event_t中的data指標是void
Time of Update: 2018-12-03
nginx是一個開源的高效能web伺服器系統,事件驅動的請求處理方式和極其苛刻的資源使用方式,使得nginx成為名副其實的高效能伺服器。nginx的源碼品質也相當高,作者“家釀”了許多代碼,自造了不少輪子,諸如記憶體池、緩衝區、字串、鏈表、紅/黑樹狀結構等經典資料結構,事件驅動模型,http解析,各種子處理模組,甚至是自動編譯指令碼都是作者根據自己的理解寫出來的,也正因為這樣,才使得nginx比其他的web伺服器更加高效。nginx的代碼相當精巧和緊湊,雖然全部代碼僅有10萬行,但功能毫不遜色於
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! Nginx的記憶體池實現得很精巧,代碼也很簡潔。總的來說,所有的記憶體池基本都一個宗旨:申請大塊記憶體,避免“細水長流”。 一、建立一個記憶體池nginx記憶體池主要有下面兩個結構來維護,他們分別維護了記憶體池的頭部和資料部。此處資料部就是供使用者指派小塊記憶體的地方。 //該結構用來維護記憶體池的資料區塊,供使用者指派之用。typedef struct { u_char *last;
Time of Update: 2018-12-03
源碼分析是一個逐步取精的過程,最開始是一個大概瞭解的過程,各種認識不會太深刻,但是把這些真實的感受也記錄下來,覺得挺有意思的,可能有些認識是片面或者是不正確的,但可以通過後面更深入細緻的分析過程,不斷的糾正錯誤和深化理解。源碼分析是一個過程,經驗是逐步累積起來的,希望文字可以把這種累積的感覺也準確記錄下來。現在就看看對nginx源碼的第一印象吧。源碼包解壓之後,根目錄下有幾個子目錄和幾個檔案,最重要的子目錄是auto和src,最重要的檔案是configure指令碼,不同於絕大多數的開原始碼,ng
Time of Update: 2018-12-03
在演算法分析中,當一個演算法中包含遞迴調用時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法: (1)代入法(Substitution Method) 代入法的基本步驟是先推測遞迴方程的顯式解,然後用數學歸納法來驗證該解是否合理。 (2)迭代法(Iteration Method)
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! 在Nginx啟動初始化過程(一)中提到main函數會調用ngx_init_cycle()初始化一個全域cycle變數,本文就來看看這個ngx_init_cycle()函數究竟做了哪些初始化工作。ngx_cycle_t結構類型被定義在src/core/ngx_cycle.h檔案中,多達23個成員變數(nginx-0.7.67),初次目睹這個結構類型的時候,最讓我震驚的是成員變數void ****conf_ctx,想必大家都知道我為何而震驚了吧,
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! Linux平台上,Nginx使用epoll完成事件驅動,實現高並發;本文將不對epoll本身進行介紹(網上一堆一堆的文章介紹epoll的原理及使用方法,甚至源碼分析等),僅看一下Nginx是如何使用epoll的。 Nginx在epoll模組中定義了好幾個函數,這些函數基本都是作為回調註冊到事件抽象層的對應介面上,從而實現了事件驅動的具體化,我們看如下的一段代碼:ngx_event_module_t ngx_epoll_module_ctx
Time of Update: 2018-12-03
好久不碰基礎知識了,花了2個多小時將這兩套題做完,個人知識掌握有限,如發現錯誤之處請指明-第一套:網路基礎知識考查日期:2008/3/3姓名:Amxking一,基礎部份1、OSI的中文全稱是( 國際標準組織),它們分別是( 應用程式層(Application layer) 展示層(Presentation layer) 會話層(Session layer) 傳輸層(Transport layer) 網路層(Network layer) 資料連結層(Data link layer)
Time of Update: 2018-12-03
前不久Nginx官方放出了SPDY的patch,到目前為止都還未合并進nginx源碼,主要還是由於此patch還遠不成熟,代碼和功能都還不足夠完善。個人感覺spdy patch合并進nginx源碼還有些時日。本文是基於目前的patch,初窺一下nginx官方是如何在實現spdy。是nginx處理一個請求的大致流程,這裡只是繪製了簡單的模型,實際過程還是相當的複雜的。圖中紅色部分即是SPDY
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! 事件迴圈這個概念貌似在windows編程中提得更多,Linux程式卻很少提及這個概念。本文所提及的事件迴圈其實就是worker
Time of Update: 2018-12-03
nginx提供一套高效的定時器實現,除了nginx核心能夠使用定時器以外,我們在進行模組開發的時候也可以使用定時器來完成一些定時執行的任務。nginx定時器實現的核心是使用一棵紅/黑樹狀結構來儲存各個定時事件,每次迴圈的時候就從這棵樹裡找出逾時的事件,然後一一觸發,完成定時任務操作。下面簡單的描述一下nginx在實現定時器時的幾個關鍵點。本文是基於linux的epoll來描述的定時器實現。定時器初始化nginx阻塞於epoll_wait時可能被3類事件喚醒,分別是有讀寫事件發生、等待時間逾時和訊
Time of Update: 2018-12-03
轉載申明:本文可以任意轉載,但需註明原文地址,謝謝! 俄羅斯大牛在nginx中給我們封裝了非常好用的數組,在做nginx模組開發的時候,不必再使用原始的數組了。 nginx使用以下結構來維護數組 struct ngx_array_s { void *elts; ngx_uint_t nelts; size_t size; ngx_uint_t nalloc; ngx_pool_t
Time of Update: 2018-12-03
Web後台開發中遇到的問題五花八門,分析問題涉及到的方方面面挺多的,不容易下手。本文分享工作中遇到的一些解決問題的方法僅供參考。如果您有好方法和案例,歡迎分享。1一些系統知識ulimit -a裡的各種限制,特別是open files和core file
Time of Update: 2018-12-03
一直從事後台系統的開發工作,對web、甚至前端技術一無所知;為了響應leader提出的多面手號召,決定一探前端技術。由於個人對python是情有獨鐘,毅然決定從python web開發下手。在眾多的python
Time of Update: 2018-12-03
cURL libcurl API curl_global_initcurl_global_init.3 -- man pageNAMEcurl_global_init - Global libcurl initialisationSYNOPSIS#include <curl/curl.h>CURLcode curl_global_init(long flags );DESCRIPTIONThis function sets up the program environment