io多路轉接模型大致分為三種:select模型/poll模型/epoll模型。
io多路轉接模型的功能:可以實現對大量描述符資訊進行就緒事件監控,可以讓程序針對就緒描述符進行操作;
可以讓程序/執行緒避免因為對非就緒的描述符進行操作而阻塞。
可以讓乙個程序輪詢對大量的就緒描述符進行操作,從而實現伺服器與客戶端這種一對多的通訊。
io多路轉接模型也是一種高併發的模型。
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
引數解釋:nfds是需要監視的最大的檔案描述符+1;
readfds/writefds/exceptfds:分別表示可讀,可寫,異常事件的集合。
timeout:是乙個結構體timeval,用來設定select()的等待時間。
引數timeout的取值:
null:則表示沒有select()沒有timeout,select將會永久阻塞
0 :僅檢測描述符集合的狀態,然後立即返回,並不等待外部事件的發生。
特定的時間值:如果在指定的時間中沒有事件的發生,select將會超時返回。
1.select所能監控的描述符數量有上限-----1024(其上限主要取決於_fd_setsize);
2.select每次都需要將描述符集合拷貝到核心進行監控(使用者態與核心態之間的資料拷貝);
3.select在核心中對所有描述符進行輪詢遍歷判斷是否就緒(效能隨著資料的增多而降低)
4.select就緒後會移除集合中的所有非就緒描述符,修改集合;每次監控需要重新新增描述符(編碼複雜);
5.select返回給使用者就緒的描述符集合,但是不會直接告訴使用者哪些描述符就緒(需要使用者進行遍歷判斷哪些描述符在集合中, 並且找到就緒的描述符進行操作),效能隨著描述符的增多而降低。
1.select遵posix標準,可以進行跨平台使用。
2.select監控超時等待時間,可以精確到微秒。
I O多路轉接
對於多個非阻塞i o,怎麼知道i o何時已經處於可讀或可寫狀態?如果採用迴圈一直呼叫write read,直到返回成功,這樣的方式成為輪詢 polling 大多數時間i o沒有處於就緒狀態,因此這樣的輪詢十分浪費cpu。一種比較好的技術是使用i o多路轉接,也叫做i o多路復用。其基本思想為 先構造...
I O多路轉接
include include include include include include include include include include include 巨集定義埠號 define portnumber 8000 define max line 80 int main void...
多路I O轉接之epoll模型
epoll是linux下多路復用io介面select poll的增強版本,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率,因為它會復用檔案描述符集合來傳遞結 果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的檔案描述符集合,另一點原因就是獲取事件的時候,它無須遍歷整個...