1. 程式人生 > >IO基礎入門之I/O多路複用技術

IO基礎入門之I/O多路複用技術

在I/O程式設計過程中,當需要同時處理多個客戶端接入請求時,可以利用多執行緒或者I/O多路複用技術進行處理。I/O多路複用技術通過把多個I/O的阻塞複用到同一個select的阻塞上,從而使得系統在單執行緒的情況下可以同時處理多個客戶端請求。與傳統的多執行緒/多程序模型比,I/O多路複用的最大優勢是系統開銷小,系統不需要建立新的額外程序或者執行緒,也不需要維護這些程序和執行緒的執行,降底了系統的維護工作量,節省了系統資源,I/O多路複用的主要應用場景如下:
    伺服器需要同時處理多個處於監聽狀態或者多個連線狀態的套接字。
    伺服器需要同時處理多種網路協議的套接字。

目前支援I/O多路複用的系統呼叫有 select,pselect,poll,epoll,在Linux網路程式設計過程中,很長一段時間都使用select做輪詢和網路事件通知,然而select的一些固有缺陷導致了它的應用受到了很大的限制,最終Linux不得不在新的核心版本中尋找select的替代方案,最終選擇了epoll。epoll與select的原理比較類似,為了克服select的缺點,epoll作了很多重大改進,現總結如下:

1. 支援一個程序開啟的socket描述符(FD)不受限制(僅受限於作業系統的最大檔案控制代碼數)。
select最大的缺陷就是單個程序所開啟的FD是有一定限制的,它由FD_SETSIZE設定,預設值是1024。對於那些需要支援上萬個TCP連線的大型伺服器來說顯然太少了。可以選擇修改這個巨集,然後重新編譯核心,不過這會帶來網路效率的下降。我們也可以通過選擇多程序的方案(傳統的Apache方案)解決這個問題,不過雖然在Linux上建立程序的代價比較小,但仍舊是不可忽視的,另外,程序間的資料交換非常麻煩,對於Java由於沒有共享記憶體,需要通過Socket通訊或者其他方式進行資料同步,這帶來了額外的效能損耗,增加了程式複雜度,所以也不是一種完美的解決方案。值得慶幸的是,epoll並沒有這個限制,它所支援的FD上限是作業系統的最大檔案控制代碼數,這個數字遠遠大於1024。例如,在1GB記憶體的機器上大約是10萬個控制代碼左右,具體的值可以通過cat/proc/sys/fs/filemax察看,通常情況下這個值跟系統的記憶體關係比較大。

2. I/O效率不會隨著FD數目的增加而線性下降。
傳統的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,由於網路延時或者鏈路空閒,任一時刻只有少部分的socket是“活躍”的,但是select/poll每次呼叫都會線性掃描全部集合,導致效率呈現線性下降。epoll不存在這個問題,它只會對“活躍”的socket進行操作-這是因為在核心實現中epoll是根據每個fd上面的callback函式實現的,那麼,只有“活躍”的socket才會主動的去呼叫callback函式,其他idle狀態socket則不會。在這點上,epoll實現了一個偽AIO。針對epoll和select效能對比的benchmark測試表明:如果所有的socket都處於活躍態。例如一個高速LAN環境,epoll並不比select/poll效率高太多;相反,如果過多使用epoll_ctl,效率相比還有稍微的下降。但是一旦使用idle connections模擬WAN環境,epoll的效率就遠在select/poll之上了。

3. 使用mmap加速核心與使用者空間的訊息傳遞
無論是select,poll還是epoll都需要核心把FD訊息通知給使用者空間,如何避免不必要的記憶體複製就顯得非常重要,epoll是通過核心和使用者空間mmap使用同一塊記憶體實現。

4. epoll的API更加簡單
用來克服select/poll缺點的方法不只有epoll,epoll只是一種Linux的實現方案。在freeBSD下有kqueue,而dev/poll是最古老的Solaris的方案,使用難度依次遞增。但epoll更加簡單。

相關推薦

IO基礎入門I/O技術

在I/O程式設計過程中,當需要同時處理多個客戶端接入請求時,可以利用多執行緒或者I/O多路複用技術進行處理。I/O多路複用技術通過把多個I/O的阻塞複用到同一個select的阻塞上,從而使得系統在單執行緒的情況下可以同時處理多個客戶端請求。與傳統的多執行緒/多程序模型比,I

java併發程式設計IO基礎入門I/O技術

在I/O程式設計過程中,當需要同時處理多個客戶端接入請求時,可以利用多執行緒或者I/O多路複用技術進行處理。I/O多路複用技術通過把多個I/O的阻塞複用到同一個select的阻塞上,從而使得系統在單執行緒的情況下可以同時處理多個客戶端請求。與傳統的多執行緒/多程序模型比,

Socket網路程式設計_I/O

1. IO多路複用: 每一次網路通訊都是一個Socket的I/O流,對於伺服器而言,有兩種方法 1.傳統的多程序併發模型(每進來一個新的I/O流會分配一個新的程序管理。) 2.方法二就是I/O的多路複用

I/O技術(multiplexing)

作者:知乎使用者 連結:https://www.zhihu.com/question/28594409/answer/52835876 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 下面舉一個例子,模擬一個tcp伺服器處理30個客戶soc

Linux I/O技術-epoll

 Linux I/O多路複用技術在比較多的TCP網路伺服器中有使用,即比較多的用到select函式。Linux 2.6核心中有提高網路I/O效能的新方法,即epoll 。1、為什麼select落後     首先,在Linux核心中,select所用到的FD_SET是有限的

Linux網路程式設計---I/Oselect

1.I/O多路複用(IO multiplexing) 我們之前講了I/O多路複用和其他I/O的區別,在這裡,我們再具體討論下I/O多路複用是怎麼工作? I/O 多路複用技術就是為了解決程序或執行緒阻塞到某個 I/O 系統呼叫而出現的技術,使程序不阻塞於某個特定的 I/O 系統呼叫。

I/Oselect、poll、epoll

很早之前有寫過篇IO多路複用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 參考連結:https://segmentfault.com/a/1190000003063859 select,poll,epoll都是IO多路

I/O epoll 系統呼叫

I/O多路複用除了之前我們提到的select和poll外,epoll 也可以檢查多個檔案描述符的就緒狀態,以達到I/O多路複用的目的。 epoll 系統呼叫是 Linux 系統專有的,在 Linux 核心 2.6 版本新增,epoll 的主要優點有: 當檢

I/O水平觸發和邊沿觸發模式

多路I/O複用不管是select,poll還是epoll,其都是通過同時監聽多個檔案描述符,當有檔案檔案描述符處於就緒狀態時,觸發通知。 LT(Level Trigger,水平觸發)模式和ET(Edge Trigger,邊沿觸發)模式是兩種檔案描述符準備就緒的

Linux網路程式設計---I/Oepoll

/* TCP伺服器 用法:./server port */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string

I/O

I/O型別:     接下來我們將介紹幾種常見的I/O模型及其區別         阻塞I/O:blocking I/O(如果沒有資訊,則阻塞)       

【Linux】I/O

五種IO模型     阻塞IO(等待魚上鉤)         在核心將資料準備好之前,系統呼叫會一直等待,所有的套接字,預設是阻塞模式。         等待,拷貝資料到buf中,(等待的時間長)     非阻塞IO(定期檢視是否有魚上鉤)         如果核心還未將資料

嵌入式Linux網路程式設計,I/O,epoll()示例,epoll()客戶端,epoll()伺服器,單鏈表

文章目錄 1,I/O多路複用 epoll()示例 1.1,epoll()---net.h 1.2,epoll()---client.c 1.3,epoll()---sever.c 1.4,epoll()---linklist.h

嵌入式Linux網路程式設計,I/O,poll()示例,poll()客戶端,poll()伺服器,單鏈表

文章目錄 1,IO複用poll()示例 1.1,poll()---net.h 1.2,poll()---client.c 1.3,poll()---sever.c 1.4,poll()---linklist.h 1.5,p

嵌入式Linux網路程式設計,I/O,select()示例,select()客戶端,select()伺服器,單鏈表

文章目錄 1,IO複用select()示例 1.1 select()---net.h 1.2 select()---client.c 1.3 select()---sever.c 1.4 select()---linklist.h

嵌入式Linux網路程式設計,I/O,阻塞I/O模式,非阻塞I/O模式fcntl()/ioctl(),I/O select()/pselect()/poll(),訊號驅動I/O

文章目錄 1,I/O模型 2,阻塞I/O 模式 2.1,讀阻塞(以read函式為例) 2.2,寫阻塞 3,非阻塞模式I/O 3.1,非阻塞模式的實現(fcntl()函式、ioctl() 函式)

UNIX網路程式設計-I/O

目錄 Unix下可用的5種I/O模型 阻塞式I/O模型 非阻塞式I/O模型 I/O複用模型 訊號驅動式I/O模型 非同步I/O模型 各種I/O模型的比較 參考   Unix下可用的5種I/O模型 阻塞式I/O 非阻塞式I/O

I/O伺服器程式設計

一、實驗目的 理解I/O多路複用技術的原理。 學會編寫基本的單執行緒併發伺服器程式和客戶程式。 二、實驗平臺 ubuntu-8.04作業系統 三、實驗內容 採用I/O多路複用技術實現單執行緒併發伺服器,完成使用一個執行緒處理併發客戶請求的功能。 四、實驗原理 除了可以採用多

淺談網路I/O模型 select & poll & epoll

我們首先需要知道select,poll,epoll都是IO多路複用的機制。I/O多路複用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,

Linux 下I/O總結

 select,poll,epoll都是IO多路複用的機制。I/O多路複用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件