Nginx之因此爲廣大碼農喜好,除了其高性能外,還有其優雅的系統架構。與Memcached的經典多線程模型相比,Nginx是經典的多進程模型。Nginx啓動後以daemon的方式在後臺運行,後臺進程包含一個master進程和多個worker進程,具體以下圖:html
圖1 Nginx多進程模型nginx
master進程主要用來管理worker進程,具體包括以下4個主要功能:
(1)接收來自外界的信號。
(2)向各worker進程發送信號。
(3)監控woker進程的運行狀態。
(4)當woker進程退出後(異常狀況下),會自動從新啓動新的woker進程。
woker進程主要用來處理網絡事件,各個woker進程之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker進程中處理,woker進程個數通常設置爲機器CPU核數。git
對Nginx進程的控制主要是經過master進程來作到的,主要有兩種方式:
(1)手動發送信號
從圖1能夠看出,master接收信號以管理衆woker進程,那麼,能夠經過kill向master進程發送信號,好比kill -HUP pid用以通知Nginx從容重啓。所謂從容重啓就是不中斷服務:master進程在接收到信號後,會先從新加載配置,而後再啓動新進程開始接收新請求,並向全部老進程發送信號告知再也不接收新請求並在處理完全部未處理完的請求後自動退出。
(2)自動發送信號
能夠經過帶命令行參數啓動新進程來發送信號給master進程,好比./nginx -s reload用以啓動一個新的Nginx進程,而新進程在解析到reload參數後會向master進程發送信號(新進程會幫咱們把手動發送信號中的動做自動完成)。固然也能夠這樣./nginx -s stop來中止Nginx。github
Nginx採用異步非阻塞的方式來處理網絡事件,相似於Libevent,具體過程以下圖:緩存
圖2 Nginx網絡事件服務器
master進程先建好須要listen的socket後,而後再fork出多個woker進程,這樣每一個work進程均可以去accept這個socket。當一個client鏈接到來時,全部accept的work進程都會受到通知,但只有一個進程能夠accept成功,其它的則會accept失敗。Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work進程在accept鏈接,從而解決驚羣問題。當一個worker進程accept這個鏈接後,就開始讀取請求,解析請求,處理請求,產生數據後,再返回給客戶端,最後才斷開鏈接,這樣一個完成的請求就結束了。網絡
memcached是一款很是普及的服務器端緩存軟件,memcached主要是基於Libevent庫進行開發的。數據結構
Memcached主要是基於Libevent的事件庫來實現網絡線程模型的。
Memcached的網絡線程模型主要涉及兩個主要文件:memcached.c 和thread.c文件。
咱們這邊主要分析tcp的模型。memcached也支持udp。多線程
1. memcached首先在主線程中會建立main_base,memcached的主線程的主要工做就是監聽和接收listen和accpet新進入的鏈接。架構
2. 當memcached啓動的時候會初始化N個worker thread工做線程,每一個工做線程都會有本身的LIBEVENT_THREAD數據結構來存儲線程的信息(線程基本信息、線程隊列、pipe信息)。worker thread工做線程和main thread主線程之間主要經過pipe來進行通訊。
3. 當用戶有鏈接進來的時候,main thread主線程會經過求餘的方式選擇一個worker thread工做線程。
4. main thread會將當前用戶的鏈接信息放入一個CQ_ITEM,而且將CQ_ITEM放入這個線程的conn_queue處理隊列,而後主線程會經過寫入pipe的方式來通知worker thread工做線程。
5. 當工做線程獲得主線程main thread的通知後,就會去本身的conn_queue隊列中取得一條鏈接信息進行處理,建立libevent的socket讀寫事件。
6. 工做線程會監聽用戶的socket,若是用戶有消息傳遞過來,則會進行消息解析和處理,返回相應的結果。
流程圖
詳情見:http://www.lvtao.net/c/623.html
高併發服務器代碼:https://github.com/manmao/Module/tree/master/mult_process_server