動圖瞭解I/O多路複用

啥叫I/O多路複用? epoll又是個什麼東西? 你或許看過不少文章,可是仍是感受雲裏霧裏的,今天,咱們拋開文字,釋放動圖,或許你就理解了。服務器

I/O多路複用

一般的一次的請求結果以下圖所示:微信

可是,服務器每每不會只處理一次請求,每每是多個請求,這一個請求,這時候每來一個請求,就會生成一個進程或線程。socket

在這些請求線程或者進程中,大部分都處於等待階段,只有少部分是接收數據。這樣一來,很是耗費資源,並且這些線程或者進程的管理,也是個事兒。.net

因而,有人想到一個辦法:咱們只用一個線程或者進程來和系統內核打交道,並想辦法把每一個應用的I/O流狀態記錄下來,一有響應變及時返回給相應的應用。線程

或者下圖:3d

select、poll、epoll

select, poll, epoll 都是I/O多路複用的具體實現,他們出現是有前後順序的。code

select是第一個實現 (1983 左右在BSD裏面實現的)。cdn

select 被實現後,發現諸多問題,而後1997年實現了poll,對select進行了改進,select和poll是很相似的。blog

再後來,2002作出重大改進實現了epoll。進程

epoll和 select/poll 有着很大的不一樣:

例如:select/poll的處理流程以下:

而epoll的處理流程以下:

這樣,就無需遍歷成千上萬個消息列表了,直接能夠定位哪一個socket有數據。

那麼,這是如何實現的呢?

早期的時候 epoll的實現是一個哈希表,可是後來因爲佔用空間比較大,改成了紅黑樹和鏈表。

其中鏈表中所有爲活躍的連接,紅黑樹中放的是全部事件。兩部分各司其職。 這樣一來,當收到內核的數據時,只需遍歷鏈表中的數據就好了,而註冊read事件或者write事件的時候,向紅黑樹中記錄。

結果致使:

  • 建立\修改\刪除消息效率很是高:O(logN)。
  • 獲取活躍連接也很是快,由於在一個時間內,大部分是不活躍的連接,活躍的連接是少數,只須要遍歷少數活躍的連接就行了

更多精彩內容,請關注個人微信公衆號 互聯網技術窩 或者加微信共同探討交流:

參考文獻:

相關文章
相關標籤/搜索