啥叫I/O多路複用? epoll又是個什麼東西? 你或許看過很多文章,但是還是感覺雲裡霧裡的,今天,我們抛開文字,釋放動圖,或許你就理解了。
I/O多路複用
通常的一次的請求結果如下圖所示:
但是,服務器往往不會隻處理一次請求,往往是多個請求,這一個請求,這時候每來一個請求,就會生成一個進程或線程。
在這些請求線程或者進程中,大部分都處于等待階段,隻有少部分是接收數據。這樣一來,非常耗費資源,而且這些線程或者進程的管理,也是個事兒。
于是,有人想到一個辦法:我們隻用一個線程或者進程來和系統内核打交道,并想辦法把每個應用的I/O流狀态記錄下來,一有響應變及時返回給相應的應用。
或者下圖:
select、poll、epoll
select, poll, epoll 都是I/O多路複用的具體實現,他們出現是有先後順序的。
select是第一個實現 (1983 左右在BSD裡面實現的)。
select 被實現後,發現諸多問題,然後1997年實現了poll,對select進行了改進,select和poll是很類似的。
再後來,2002做出重大改進實現了epoll。
epoll和 select/poll 有着很大的不同:
例如:select/poll的處理流程如下:
而epoll的處理流程如下:
這樣,就無需遍曆成千上萬個消息列表了,直接可以定位哪個socket有數據。
那麼,這是如何實現的呢?
早期的時候 epoll的實現是一個哈希表,但是後來由于占用空間比較大,改為了紅黑樹和鍊表。
其中鍊表中全部為活躍的鍊接,紅黑樹中放的是所有事件。兩部分各司其職。 這樣一來,當收到内核的數據時,隻需遍曆鍊表中的數據就行了,而注冊read事件或者write事件的時候,向紅黑樹中記錄。
結果導緻:
更多精彩内容,請關注我的微信公衆号 互聯網技術窩 或者加微信共同探讨交流:
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!