I O多路復用的一點理解

2022-08-09 09:06:15 字數 1170 閱讀 1185

寫這個是因為乙個關於redis為什麼這麼快的答案中,其中乙個原因,就是redis使用了i/o多路復用模型。於是我回想起乙個我覺得很魔幻的經歷,就是在2年前換工作時,連續在三場面試中被問到了i/o多路復用,select、poll、epoll的問題。關於為什麼一群寫業務的工程師都痴迷於這個問題依然是個謎,不過很顯然,除非你能打死他們,要不就只能選擇加入。

首先先把這個詞拆開看,i/o是指網路i/o;多路,是指多個tcp鏈結或者channel,當發生多個網路請求時,i/o多路就產生了。而復用,是指復用乙個或少量執行緒,比如單程序的redis,所有的請求都需要復用乙個程序。所以這個詞串起來理解就是:很多個網路i/o復用乙個或少量的執行緒來處理這些連線。它還有個別稱,叫「事件驅動」,就和字面意思一樣,就是需要動的時候有人叫你,不叫你的時候你就躺著就行。

目前支援多路復用的系統呼叫有select、poll、epoll。

int

select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

可以看出select可以監聽fd_set *readfds, fd_set *writefds, fd_set *exceptfds三種描述符,

缺點:每次呼叫select,都需要把待監控的fd集合從使用者態拷貝到核心態,當fd很大時,開銷很大。

每次呼叫select,都需要輪詢一遍所有的fd,檢視就緒狀態。

select支援的最大檔案描述符(fd)數量有限,預設是1024。

int poll(struct pollfd *fds, nfds_t nfds, int

timeout)

struct

pollfd

;

pollfd結構包括了events(要監聽的事件)和revents(實際發生的事件)。而且也需要在函式返回後遍歷pollfd來獲取就緒的描述符。

❓那麼問題來了,既然這麼好用的東西出現了,select和poll還用在**呢?

管理少量連線(比如fd數 < 10),poll/select 是比較輕量級的,不需要去建立乙個epoll的fd。而且,select實現起來應該比epoll簡單不少。

編寫跨平台**,保證**任意平台都能用,那麼 cygwin 下只有 poll 給你,win32下對應 select。

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 往流中讀出資料...