一、程序模型
nginx之所以為廣大碼農喜愛,除了其高效能外,還有其優雅的系統架構。與memcached的經典多執行緒模型相比,nginx是經典的多程序模型。nginx啟動後以daemon的方式在後台執行,後台程序包含乙個master程序和多個worker程序,具體如下圖:
圖1 nginx多程序模型
master程序主要用來管理worker程序,具體包括如下4個主要功能:
(1)接收來自外界的訊號。
(2)向各worker程序傳送訊號。
(3)監控woker程序的執行狀態。
(4)當woker程序退出後(異常情況下),會自動重新啟動新的woker程序。
woker程序主要用來處理網路事件,各個woker程序之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,乙個請求只可能在乙個woker程序中處理,woker程序個數一般設定為機器cpu核數。
二、程序控制
對nginx程序的控制主要是通過master程序來做到的,主要有兩種方式:
(1)手動傳送訊號
從圖1可以看出,master接收訊號以管理眾woker程序,那麼,可以通過kill向master程序傳送訊號,比如kill
-hup
並向所有老程序傳送訊號告知不再接收新請求並在處理完所有未處理完的請求後自動退出。
(2)自動傳送訊號
可以通過帶命令列引數啟動新程序來傳送訊號給master程序,比如./nginx -s
reload用以啟動乙個新的nginx程序,而新程序在解析到reload引數後會向master程序傳送訊號(新程序會幫我們把手動傳送訊號中的動作
自動完成)。當然也可以這樣./nginx -s stop來停止nginx。
三、網路事件
nginx採用非同步非阻塞的方式來處理網路事件,類似於libevent,具體過程如下圖:
圖2 nginx網路事件
master程序先建好需要listen的socket後,然後再fork出多個woker程序,這樣每個work程序都可以去
accept這個socket。當乙個client連線到來時,所有accept的work程序都會受到通知,但只有乙個程序可以accept成功,其它
的則會accept失敗。nginx提供了一把共享鎖accept_mutex來保證同一時刻只有乙個work程序在accept連線,從而解決驚群問
題。當乙個worker程序accept這個連線後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線,這樣乙個完成的
請求就結束了。
python之多程序
要讓python實現多程序 multiprocessing 我們先來了解作業系統相關知識。unix 和 linux 作業系統提供了乙個 fork 函式系統呼叫,它非常特殊。普通的函式,呼叫一它次,執行一次,但是 fork 函式呼叫一次執行兩次,因為作業系統自動把當前程序 稱為父程序 複製了乙份 稱為...
nodejs之多程序
最近感覺壓力有點大,來看看nodejs的書,好讓自己輕鬆一下。正如標題所言,這篇文章寫的是關於nodejs程序方面的知識。眾所周知,nodejs是單執行緒的額,在程式設計方面有著得天獨厚的先天優勢,可以讓我們省去了併發程式設計所帶來的種種苦惱,基於事件驅動的它,面對著io高併發,可以做得很好,但是,...
Linux網路程式設計之多程序
多程序模型 多程序模型下,注意如何在程序之間通訊以及孤兒程序和殭屍程序的處理,可以外配上程序池作為計算任務 非同步任務的處理。fork server include include include include include include include include include voi...