此處的百萬并發(fā)指的是可以建立至少100w個客戶端連接,不考慮業(yè)務處理。
反應器模式下的epoll相比起普通的epoll不同在于:普通的epoll在獲取到就緒狀態(tài)的event結構體之后,先判斷是什么類型的fd,再進行操作。而reactor先判斷是什么類型的事件,再進行操作。本文從頭用reactor設計模式來構建一個epoll服務器,這個過程中每次發(fā)生IO事件都要注意維護用戶空間的數(shù)據(jù)結構和內核的epoll實例,下面是構建百萬并發(fā)服務器的詳細地步驟(暫不包含并發(fā)量測試):
導入相關的包并設置宏
聲明事件處理函數(shù)
構建存儲數(shù)據(jù)結構
設計一個結構體,用于存儲IO相關的信息,并建立全局數(shù)組。后續(xù)需要不斷地維護該數(shù)組,一旦發(fā)生了IO事件就需要進行更新。結構體的內容包括:1、文件描述符。2、接收到的數(shù)據(jù)和數(shù)據(jù)長度。3、要發(fā)送的數(shù)據(jù)和數(shù)據(jù)長度。4、用于處理接收數(shù)據(jù)的回調函數(shù),請求連接和連接成功后接收到數(shù)據(jù),要調用不同的處理函數(shù)。5、用于處理發(fā)送數(shù)據(jù)的回調函數(shù)。
編寫epoll實例的維護函數(shù)
包括修改節(jié)點和增加節(jié)點的步驟
實現(xiàn)accept事件的回調函數(shù)
某個文件描述符接收到數(shù)據(jù)之后,相應地要維護全局數(shù)組,以及epoll實例。全局數(shù)組將相應的節(jié)點的fd屬性進行修改,并初始化數(shù)據(jù)區(qū)為0,同時還要選擇處理接收數(shù)據(jù)的回調函數(shù)。
實現(xiàn)recv事件的回調函數(shù)
除了相應的數(shù)據(jù)區(qū),還要注意修改epoll紅黑樹里相應節(jié)點的狀態(tài)。
實現(xiàn)send事件的回調函數(shù)
較為簡單,全局數(shù)組不需要維護,但是內核的epoll實例需要維護。
、
編寫初始化服務器的函數(shù)
建立紅黑樹實例并建立服務器套接字
一共要建立20個服務器套接字。同樣的,每成功建立一次,都要維護全局數(shù)組和epoll實例。注意套接字描述符的接收數(shù)據(jù)回調函數(shù)選擇是accept_cb;
檢測就緒狀態(tài)的fd并處理
根據(jù)檢測到的事件進行處理,而不是根據(jù)文件描述符是服務器套接字還是通信套接字進行處理。值得注意是處理EPOLLIN事件中,雖然代碼上調用的都是recv_callback函數(shù),但實際上如果i是服務器套接字,那么調用的依然是accpet_callback。這是因為union特性,union的屬性如果都是同一類型,那么進行賦值之后,無論調用哪一個屬性都是都可以調用同一個值。文章來源:http://www.zghlxwxcb.cn/news/detail-781471.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-781471.html
百萬并發(fā)
- 整個過程涉及到一些時間處理的細節(jié),是為了計算服務器處理并發(fā)的效率。
- 全局數(shù)組設置很大,這是為了處理百萬并發(fā),不是很科學但是能用。
- 百萬并發(fā)處理一方面體現(xiàn)在三方面,全局數(shù)組的大小,epoll模型,服務器套接字的數(shù)量。
到了這里,關于用反應器模式和epoll構建百萬并發(fā)服務器的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!