io多路復用:i/o是指網路i/o,多路指多個tcp連線(即socket或者channel),復用指復用乙個或幾個執行緒。意思說乙個或一組執行緒處理多個tcp連線。最大優勢是減少系統開銷小,不必建立過多的程序/執行緒,也不必維護這些程序/執行緒。
io多路復用使用兩個系統呼叫(select/poll/epoll和recvfrom),blocking io只呼叫了recvfrom;select/poll/epoll 核心是可以同時處理多個connection,而不是更快,所以連線數不高的話,效能不一定比多執行緒+阻塞io好,多路復用模型中,每乙個socket,設定為non-blocking,阻塞是被select這個函式block,而不是被socket阻塞的。
select機制
基本原理:
客戶端操作伺服器時就會產生這三種檔案描述符(簡稱fd):writefds(寫)、readfds(讀)、和exceptfds(異常)。select會阻塞住監視3類檔案描述符,等有資料、可讀、可寫、出異常 或超時、就會返回;返回後通過遍歷fdset整個陣列來找到就緒的描述符fd,然後進行對應的io操作。
優點:
幾乎在所有的平台上支援,跨平台支援性好
缺點:
由於是採用輪詢方式全盤掃瞄,會隨著檔案描述符fd數量增多而效能下降。
每次呼叫 select(),需要把 fd 集合從使用者態拷貝到核心態,並進行遍歷(訊息傳遞都是從核心到使用者空間)
預設單個程序開啟的fd有限制是1024個,可修改巨集定義,但是效率仍然慢。
poll機制:
基本原理與select一致,也是輪詢+遍歷;唯一的區別就是poll沒有最大檔案描述符限制(使用鍊錶的方式儲存fd)。
epoll機制:
基本原理:
沒有fd個數限制,使用者態拷貝到核心態只需要一次,使用時間通知機制來觸發。通過epoll_ctl註冊fd,一旦fd就緒就會通過callback**機制來啟用對應fd,進行相關的io操作。
epoll之所以高效能是得益於它的三個函式
1)epoll_create()系統啟動時,在linux核心裡面申請乙個b+樹結構檔案系統,返回epoll物件,也是乙個fd
2)epoll_ctl() 每新建乙個連線,都通過該函式操作epoll物件,在這個物件裡面修改新增刪除對應的鏈結fd, 繫結乙個callback函式
3)epoll_wait() 輪訓所有的callback集合,並完成對應的io操作
優點:
沒fd這個限制,所支援的fd上限是作業系統的最大檔案控制代碼數,1g記憶體大概支援10萬個控制代碼
效率提高,使用**通知而不是輪詢的方式,不會隨著fd數目的增加效率下降
核心和使用者空間mmap同一塊記憶體實現(mmap是一種記憶體對映檔案的方法,即將乙個檔案或者其它物件對映到程序的位址空間)
例子:100萬個連線,裡面有1萬個連線是活躍,我們可以對比 select、poll、epoll 的效能表現
select:不修改巨集定義預設是1024,l則需要100w/1024=977個程序才可以支援 100萬連線,會使得cpu效能特別的差。
poll: 沒有最大檔案描述符限制,100萬個鏈結則需要100w個fd,遍歷都響應不過來了,還有空間的拷貝消耗大量的資源。
epoll: 請求進來時就建立fd並繫結乙個callback,主需要遍歷1w個活躍連線的callback即可,即高效又不用記憶體拷貝。
I O多路復用技術(multiplexing)
首先,要從你常用的io操作談起,比如read和write,通常io操作都是阻塞i o的,也就是說當你呼叫read時,如果沒有資料收到,那麼執行緒或者程序就會被掛起,直到收到資料。l 這樣,當伺服器需要處理1000個連線的的時候,而且只有很少連線忙碌的,那麼會需要1000個執行緒或程序來處理1000個...
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 ...