1. 程式人生 > >【網路】select模型基本概念!!

【網路】select模型基本概念!!

select模型

select機制
當使用read等系統呼叫在緩衝區裡面讀取資料的時候,如果和緩衝區裡面沒有資料,那麼函式會被系統直接掛起等待,這種函式稱之為阻塞式介面。如果緩衝區內一直沒有資料那麼該系統呼叫會一直阻塞,知道緩衝區內有可讀資料。使用select函式的時候,select可以註冊多個需要執行IO的socket,並不斷的呼叫select讀取被啟用的socket,即在一個執行緒上面可以同時處理多個IO請求。
這裡寫圖片描述
select相關的API

#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

引數說明:
- maxfd:被監聽的檔案描述符的總數
- readset、writeset、exceptset分別對應著可讀、可寫、異常等事件對應的檔案描述符集
- timeout:select函式的超時時間
- timeval結構體:

struct timeval
{      
    long tv_sec;   /*秒 */
    long tv_usec;  /*微秒 */   
};

- 返回值:如果超時返回0,失敗返回-1,>0表示就緒的檔案描述符的個數。
操作檔案檔案描述符集的巨集

#include <sys/select.h>   
int FD_ZERO(int fd, fd_set *fdset);   //一個 fd_set型別變數的所有位都設為 0
int FD_CLR(int fd, fd_set *fdset);  //清除某個位時可以使用
int FD_SET(int fd, fd_set *fd_set);   //設定變數的某個位置位
int FD_ISSET(int fd, fd_set *fdset); //測試某個位是否被置位

select使用規範
1. 在使用select之前必須將fs_set置0
2. 在設定select超時時,如果超時則立即返回
3. 在select返回之後適應FD_ISSET檢查集合裡面的置位

深入理解select模型
在select模型裡面採用的是點陣圖的方法表示檔案描述符的,即如果一個fd_set是8個位元組,那麼就可以表示8個檔案描述符(1~8)。
1. 如果使用FD_ZERO(set),那麼set表示為0000 0000
2. 如果使用FD_SET(3,&set),set表示為0000 0100
3. 如果在加入5,6,那麼set表示為0011 0100
4. 當select返回的時候,如果檔案描述符3和以就緒,那麼返回值為0001 0100。
5. 系統裡面的檔案描述符的數量是有限的,所以fs_set的值也是有上限的,上限取決於sizeof(fd_set),如果sizeof(set)的值為512,那麼能夠表示的檔案描述符的最大限度是512*8.

select處理帶外資料
在網路程式中,select能處理的異常情況只有一種:socket上接有帶外資料。
什麼是帶外資料

帶外資料(out—of—band data),有時也稱為加速資料(expedited data),
是指連線雙方中的一方發生重要事情,想要迅速地通知對方。
這種通知在已經排隊等待發送的任何“普通”(有時稱為“帶內”)資料之前傳送。
帶外資料設計為比普通資料有更高的優先順序。
帶外資料是對映到現有的連線中的,而不是在客戶機和伺服器間再用一個連線。