tft每日頭條

 > 生活

 > 多路複用與多路分解概念

多路複用與多路分解概念

生活 更新时间:2025-01-04 05:48:51

啥叫I/O多路複用? epoll又是個什麼東西? 你或許看過很多文章,但是還是感覺雲裡霧裡的,今天,我們抛開文字,釋放動圖,或許你就理解了。

I/O多路複用

通常的一次的請求結果如下圖所示:

多路複用與多路分解概念(動圖了解IO多路複用)1

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

多路複用與多路分解概念(動圖了解IO多路複用)2

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

多路複用與多路分解概念(動圖了解IO多路複用)3

于是,有人想到一個辦法:我們隻用一個線程或者進程來和系統内核打交道,并想辦法把每個應用的I/O流狀态記錄下來,一有響應變及時返回給相應的應用。

多路複用與多路分解概念(動圖了解IO多路複用)4

或者下圖:

多路複用與多路分解概念(動圖了解IO多路複用)5

select、poll、epoll

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

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

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

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

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

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

多路複用與多路分解概念(動圖了解IO多路複用)6

而epoll的處理流程如下:

多路複用與多路分解概念(動圖了解IO多路複用)7

這樣,就無需遍曆成千上萬個消息列表了,直接可以定位哪個socket有數據。

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

早期的時候 epoll的實現是一個哈希表,但是後來由于占用空間比較大,改為了紅黑樹和鍊表。

多路複用與多路分解概念(動圖了解IO多路複用)8

其中鍊表中全部為活躍的鍊接,紅黑樹中放的是所有事件。兩部分各司其職。 這樣一來,當收到内核的數據時,隻需遍曆鍊表中的數據就行了,而注冊read事件或者write事件的時候,向紅黑樹中記錄。

結果導緻:

  • 創建\修改\删除消息效率非常高:O(logN)。
  • 獲取活躍鍊接也非常快,因為在一個時間内,大部分是不活躍的鍊接,活躍的鍊接是少數,隻需要遍曆少數活躍的鍊接就好了

更多精彩内容,請關注我的微信公衆号 互聯網技術窩 或者加微信共同探讨交流:

多路複用與多路分解概念(動圖了解IO多路複用)9

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved