select, poll和epoll的區別

2021-05-24 13:24:35 字數 1197 閱讀 5766

//我只用過select:select 最不能忍受的是乙個程序所開啟的fd是有一定限制的,由fd_setsize設定,預設值是2048。對於那些需要支援的上萬連線數目的im伺服器來說顯然太少了,select要掃瞄各個檔案描述符,而epool採用mmap更高效 select()系統呼叫提供乙個機制來實現同步多元i/o: #include

#include

#include

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); fd_clr(int fd, fd_set *set); fd_isset(int fd, fd_set *set); fd_set(int fd, fd_set *set); fd_zero(fd_set *set); 呼叫select()將阻塞,直到指定的檔案描述符準備好執行i/o,或者可選引數timeout指定的時間已經過去。 監視的檔案描述符分為三類set,每一種對應等待不同的事件。readfds中列出的檔案描述符被監視是否有資料可供讀取(如果讀取操作完成則不會阻塞)。writefds中列出的檔案描述符則被監視是否寫入操作完成而不阻塞。最後,exceptfds中列出的檔案描述符則被監視是否發生異常,或者無法控制的資料是否可用(這些狀態僅僅應用於套接字)。這三類set可以是null,這種情況下select()不監視這一類事件。 select()成功返回時,每組set都被修改以使它只包含準備好i/o的檔案描述符。例如,假設有兩個檔案描述符,值分別是7和9,被放在readfds中。當select()返回時,如果7仍然在set中,則這個檔案描述符已經準備好被讀取而不會阻塞。如果9已經不在set中,則讀取它將可能會阻塞(我說可能是因為資料可能正好在select返回後就可用,這種情況下,下一次呼叫select()將返回檔案描述符準備好讀取)。 第乙個引數n,等於所有set中最大的那個檔案描述符的值加1。因此,select()的呼叫者負責檢查哪個檔案描述符擁有最大值,並且把這個值加1再傳遞給第乙個引數。 timeout引數是乙個指向timeval結構體的指標,timeval定義如下: #include

int poll (struct pollfd *fds, unsigned int nfds, int timeout); 和select()不一樣,poll()沒有使用低效的三個基於位的檔案描述符set,而是採用了乙個單獨的結構體pollfd陣列,由fds指標指向這個組。pollfd結構體定義如下: #include

select poll和epoll的區別

select,poll,epoll都是io多路復用的機制。i o多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒 能夠通知程式進行相應的讀寫操作。select僅僅知道i o事件發生的檔案描述符的數量,但並不知道是哪幾個 1 時間複雜度 o n 2 優點 跨平台支...

select,poll和epoll的API複習筆記

環境 centos7 xshell 前言 select poll epoll 的區別一定要清楚 select 優點是跨平台,而poll相對其沒有1024檔案描述符的限制,共有的缺點是 1.每次監聽都需要將監聽的資訊從應用層拷貝到核心。2.返回變化的檔案描述符的個數,具體哪個檔案描述符變化需要遍歷。3...

select poll和epoll的區別

作業系統在處理io的時候,主要有兩個階段 我們一般將上述過程簡化理解為 select,poll,epoll都是io多路復用的機制。i o多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒 能夠通知程式進行相應的讀寫操作。但select,poll,epoll本質上都...