1. 程式人生 > >IO多路複用:select,poll,epoll的區別

IO多路複用:select,poll,epoll的區別

I/O多路複用:
(1)單個執行緒,通過記錄跟蹤每個I/O流(sock)的狀態,來同時管理多個I/O流)
(2)I/O多路複用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的。

應用場景:
(1)伺服器需要同時處理多個處於監聽狀態或者多個連線狀態的套接字;
(2)伺服器需要同時處理多種網路協議的套接字

舉3個實現機制的例子:
1.select:
(1)如果任何一個sock(I/O stream)出現了資料,select 僅僅會返回,但是並不會告訴你是哪個sock上有資料,於是你只能自己一個一個的找。
(2)只能監視1024個連結,linux 定義在標頭檔案中的,參見FD_SETSIZE。
(3)非執行緒安全。
(4)每次呼叫select,都需要把fd集合從使用者態拷貝到核心態,這個開銷在fd很多時會很大
(5)同時每次呼叫select都需要在核心遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大

這裡寫圖片描述

2.poll
(1)去除了1024個連結的限制
(2)非執行緒安全。

epoll在java中有以下幾點
(1)執行緒安全
(2)返回資料時,告訴你哪個sock有資料
(3)僅用於linux2.6以上核心
(4)nginx的事件處理就是使用epoll機制的
(5)去除了1024個連結的限制
(6)每次返回時,只返回就緒連結串列中的資料

這裡寫圖片描述