1. 程式人生 > >高效能高併發伺服器架構淺析--多執行緒模式

高效能高併發伺服器架構淺析--多執行緒模式

談到高效能高併發伺服器的設計與開發,很關鍵的一模組就是高效的I/O處理了。

那麼如何高效的處理I/O呢?當然是首推epoll來實現I/O複用了!

首先我們來簡單的瞭解下epoll,有經驗的工程師都知道的。epoll是目前linux作業系統上最強大的事件管理機制,也是linux作業系統上特有的I/O複用技術。

它在實現和使用上與select、poll都有很大的差異。epoll使用一組函式(epoll_create、epoll_wait、epoll_ctl)來完成任務,epoll把使用者關心的檔案描述符上的事件放在核心裡的事件列表中,而不需要像select和poll那樣每次呼叫都要重複傳入檔案描述符集或事件集(有關epoll的使用後面會稍微詳細的分析一下)。

不多扯了,切入正題:

高併發伺服器的框架設計,雖然種類繁多,但基本都差不多,萬變不離其宗。都可分為I/O處理模組,邏輯處理模組和網路儲存模組。如下圖所示


對於I/O的併發處理我的思路是,主執行緒護著一個epoll事物處理負責監聽,接受網路上的連線請求,然後把連線套接字分發給各個邏輯處理執行緒。

同時邏輯處理執行緒也維護著一個epoll事物處理,而邏輯處理執行緒的epoll只負責處理與連線套接字相關的接收、傳送和關閉連線等事物。

這樣每個業務處理執行緒都同時可以處理多個客戶連線請求。這樣一來,每個執行緒都可以在無鎖狀態下保持高效的工作。負載均衡由主執行緒來承擔。

執行緒的個數可以與伺服器的cpu核數相關,執行緒過少則無法發揮出伺服器硬體的潛力。執行緒過多則給伺服器帶來了執行緒頻繁切換的負擔。

那麼主執行緒如何把連線套接字分發給邏輯處理執行緒的呢?我的建議是用linux的高階IO管道進行通訊,所有的事件觸發都可以在epoll中來完成。

這裡不建議用鎖實現執行緒通訊,個人比較排斥鎖,能不用鎖就儘量不用鎖。

如下圖所示:


從圖中可以看出這個設計的優點,每個執行緒都維護者自己的事件迴圈,各自都獨立的監聽這自己感興趣的事件。