天天看點

高并發程式設計_linux高并發程式設計之select, poll epoll

一、概述 

select,poll,epoll技術又稱IO multiplexing或IO多路複用技術,有些地方也稱這種IO方式為event driven IO。select,poll,epoll是設計高性能服務的常用手段,select/epoll的好處就在于單個process就可以同時處理多個網絡連接配接的IO。它的基本原理就是select,poll,epoll這個function會不斷的輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序。

二、詳述

select,poll,epoll都是IO多路複用的機制。I/O多路複用就是通過一種機制,一個程序可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實作會負責把資料從核心拷貝到使用者空間。

1、select

select函數監視檔案描述符,調用後select函數會阻塞,直到有描述符就緒,或者逾時,函數傳回,當select函數傳回後,就可以周遊描述符,找到就緒的描述符。

select的一個缺點在于單個程序能夠監視的檔案描述符的數量也存在最大限制,在Linux上一般為1024,可以通過修改宏定義甚至重新編譯核心的方式提升這一限制。但是這樣也會造成效率的降低。

2、poll

沒有最大限制(但是數量過大後性能也是會下降)。和select函數一樣,poll傳回後,需要輪詢來擷取就緒的描述符。

select和poll都需要在傳回後,通過周遊檔案描述符來擷取已經就緒的socket。事實上,同時連接配接的大量用戶端在同一時刻可能隻有很少的就緒狀态,是以随着監視的描述符數量的增長,其效率也會線性下降。

3、epoll

相對于select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個檔案描述符管理多個描述符。

三、對比

1、支援一個程序所能打開的最大連接配接數

高并發程式設計_linux高并發程式設計之select, poll epoll

2、FD劇增後帶來的IO效率問題

高并發程式設計_linux高并發程式設計之select, poll epoll

3、消息傳遞方式

高并發程式設計_linux高并發程式設計之select, poll epoll

在選擇select,poll,epoll時要根據具體的使用場合以及這三種方式的自身特點:

1、表面上看epoll的性能最好,但是在連接配接數少并且連接配接都十分活躍的情況下,select和poll的性能可能比epoll好,畢竟epoll的通知機制需要很多函數回調。

2、select低效是因為每次它都需要輪詢。但低效也是相對的,視情況而定,也可通過良好的設計改善。

四、使用場景

1)當客戶處理多個描述符時(一般是互動式輸入和網絡套接口),必須使用I/O複用。

2)當一個客戶同時處理多個套接口時,這種情況是可能的,但很少出現。

3)如果一個TCP伺服器既要處理監聽套接口,又要處理已連接配接套接口,一般也要用到I/O複用。

4)如果一個伺服器即要處理TCP,又要處理UDP,一般要使用I/O複用。

5)如果一個伺服器要處理多個服務或多個協定,一般要使用I/O複用。

6)你讀到這裡時腦海中那個場景

五、視訊環節

繼續閱讀