linux 多路IO轉接伺服器之select

2021-10-07 10:51:34 字數 2464 閱讀 2817

多路io轉接伺服器也叫做多工io伺服器。該類伺服器實現的主旨思想是,不再由應用程式自己監視客戶端連線,取而代之由核心替應用程式監視檔案。

1.select能監聽的檔案描述符個數受限於fd_setsize,一般為1024,單純改變程序開啟的檔案描述符個數並不能改變select監聽檔案個數

2.解決1024以下客戶端時使用select是很合適的,但如果鏈結客戶端過多,select採用的是輪詢模型,會大大降低伺服器響應效率,不應在select上投入更多精力

總結(面試考點!!!):

select函式傳入3個自定義的需要核心監控的檔案描述符集合(位圖),死迴圈,由核心依次遍歷所有的檔案描述符集合,判斷是否有可讀、可寫、異常事件。遍歷完,如果有事件,返回事件個數,並傳出3個檔案描述符集合(修改後的點陣圖)。如果沒有事件響應,則select阻塞一定時間後繼續輪詢。

特點:1.單個程序能夠讓核心監控的檔案描述符的數量最多為1024個。

2.每次呼叫select都要把3個fd集合從使用者態拷貝到核心態。

3.核心採用輪詢方式遍歷所有的fd,需要監控的檔案描述符越多,效率越低。

4.select是lt水平觸發,應用程式如果沒有完成對乙個已就緒的檔案描述符進行io操作,那麼下次select呼叫還會將這些檔案描述符通知應用程式。

#include

/* according to earlier standards */

#include

#include

#include

intselect

(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds,

struct timeval *timeout)

;

nfds: 		監控的檔案描述符集裡最大檔案描述符加1,因為此引數會告訴核心檢測前多少個檔案描述符的狀態

readfds: 監控有讀資料到達檔案描述符集合,傳入傳出引數,傳入的是需要監控的檔案描述符集合,傳出的是實際有讀資料到達的檔案描述符集合

writefds: 監控寫資料到達檔案描述符集合,傳入傳出引數

exceptfds: 監控異常發生達檔案描述符集合,如帶外資料到達異常,傳入傳出引數

timeout: 定時阻塞監控時間,3種情況

1.null,永遠等下去

2.設定timeval,等待固定時間

3.設定timeval裡時間均為0,檢查描述字後立即返回,輪詢

struct timeval ;

void

fd_clr

(int fd, fd_set *set)

;//把檔案描述符集合裡fd清0

intfd_isset

(int fd, fd_set *set)

;//測試檔案描述符集合裡fd是否置1

void

fd_set

(int fd, fd_set *set)

;//把檔案描述符集合裡fd位置1

void

fd_zero

(fd_set *set)

;//把檔案描述符集合裡所有位清0

例子(感覺還是很好理解的):

;/* 向監控檔案描述符集合allset新增新的檔案描述符connfd */

if(connfd > maxfd)

maxfd = connfd;

/* 重新整理maxfd,select第乙個引數需要 */

if(i > maxi)

maxi = i;

/* 重新整理maxi,保證maxi存的總是client最後乙個元素下標 */if(

--nready ==0)

continue;}

for(i =

0; i <= maxi; i++

)else

if(n >0)

if(--nready ==0)

break

;/* 跳出for, 但還在while中 */}}

}close

(listenfd)

;return0;

}

linux 多路IO轉接伺服器之poll

引數1是結構體陣列的首位址。events的選取 pollin普通或帶外優先資料可讀,即pollrdnorm pollrdband pollrdnorm 資料可讀 pollrdband 優先順序帶資料可讀 pollpri 高優先順序可讀資料 pollout普通或帶外資料可寫 pollwrnorm 資料...

I O多路轉接之poll伺服器

函式說明 include int poll struct pollfd fds,nfds t nfds,int timeout 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 ...

I O多路轉接 epoll伺服器

在前面的兩篇部落格中,我們介紹了最早期的select和改進版的poll 但是,他兩都沒有改進的就是,想要快速知道事件就緒並沒有得到改進,兩個全部是遍歷陣列,我們都知道它的時間複雜度就是o n 效率不是很高,時間複雜度達到o 1 才是高效的 epoll是linux特有的i o復用函式,它在實現和使用上...