啥叫I/O多路複用? epoll又是個什麼東西? 你或許看過不少文章,可是仍是感受雲裏霧裏的,今天,咱們拋開文字,釋放動圖,或許你就理解了。服務器
一般的一次的請求結果以下圖所示:微信
可是,服務器每每不會只處理一次請求,每每是多個請求,這一個請求,這時候每來一個請求,就會生成一個進程或線程。socket
在這些請求線程或者進程中,大部分都處於等待階段,只有少部分是接收數據。這樣一來,很是耗費資源,並且這些線程或者進程的管理,也是個事兒。.net
因而,有人想到一個辦法:咱們只用一個線程或者進程來和系統內核打交道,並想辦法把每一個應用的I/O流狀態記錄下來,一有響應變及時返回給相應的應用。線程
或者下圖:3d
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事件的時候,向紅黑樹中記錄。
結果致使:
互聯網技術窩
或者加微信共同探討交流:參考文獻: