下面的例子來自知乎。 i/o多路復用技術(multiplexing)是什麼?
下面舉乙個例子,模擬乙個tcp伺服器處理30個客戶socket。假設你是乙個老師,讓30個學生解答一道題目,然後檢查學生做的是否正確,你有下面幾個選擇:
(a)第一種選擇:按順序逐個檢查,先檢查a,然後是b,之後是c、d。。。這中間如果有乙個學生卡主,全班都會被耽誤。
這種模式就好比,你用迴圈挨個處理socket,根本不具有併發能力。
(b)第二種選擇:你建立30個分身,每個分身檢查乙個學生的答案是否正確。 這種類似於為每乙個使用者建立乙個程序或者執行緒處理連線。
(c)第三種選擇,你站在講台上等,誰解答完誰舉手。這時c、d舉手,表示他們解答問題完畢,你下去依次檢查c、d的答案,然後繼續回到講台上等。此時e、a又舉手,然後去處理e和a。。。
這種就是
io復用模型
,linux下的select
、poll
和epoll
就是幹這個的。將使用者socket對應的fd註冊進epoll
,然後epoll
幫你監聽哪些socket上有訊息到達,這樣就避免了大量的無用操作。此時的socket應該採用非阻塞模式
。這樣,整個過程只在呼叫
select
、poll
、epoll
這些呼叫的時候才會阻塞,收發客戶訊息是不會阻塞的,整個程序或者執行緒就被充分利用起來,這就是事件驅動
,所謂的reactor模式
。
io
分為兩種:
io多路復用模型
:
多路:表示多個tcp
連線。
復用:表示公寓乙個執行緒或程序。
優點:系統開銷小,不必尾貨過多的執行緒或程序。
io多路復用
的核心是可以同時處理多個連線請求
,為此使用了兩個系統呼叫,分別是:
select/poll/epoll
–模型機制:可以監視多個描述符(fd)
,一旦某個描述符就緒(讀/寫/異常)就能通知程式進行相應的讀寫操作。讀寫操作都是自己負責的,也即是阻塞的,所以本質上都是同步(堵塞)io
。redis
支援這三種機制,預設使用epoll機制
。
recvfrom
–接收資料。
而blocking io
只呼叫了recvfrom
,所以在連線數不高的情況下,blocking io
的效能不一定比io多路復用
差。
io多路復用的三種實現機制:
select機制。
poll機制。
epoll機制。
具體情況見 io多路復用:redis中經典的reactor設計模式
[1] i/o多路復用技術(multiplexing)是什麼?
[2] io多路復用:redis中經典的reactor設計模式
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
i o多路復用
最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...
I O多路復用
我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...