Linux高性能服務編程(I/O複用)

I/O複用(本身是阻塞的)
網絡程序需要使用I/O複用技術的情況:
1.客戶端程序需要同時處理多個socket。
2.客戶端需要同時處理用戶輸入和網絡連接
3.TCP服務器要同時處理監聽socket和連接socket
4.服務器要同時處理TCP請求和UDP請求
5.服務器要同時監聽多個端口,或者處理多種服務。


linux下實現I/O複用的系統調用主要有select,poll和epoll

select系統調用的用途:在一段時間內,監聽用戶感興趣的文件描述符上的可讀,可寫和異常等事件
select系統調用的原型:
#include<sys/select.h>
int select(int nfds,fd_set readfds,fd_set writefds,fd_set exceptfds,struct timeval timeout);
nfds參數指定被監聽的文件描述符的總數,它通常被設置爲select監聽的所有文件描述符中的最大值加1,因爲文件描述符是從0開始計數的
readfds,writefds,exceptfds參數分別指向可讀,可寫和一場事件對應的文件描述符集合
timeout參數用來設置select函數的超時時間,它是一個timeval結構體類型(微秒級)的指針,採用指針參數是因爲內核將修改它以告訴應用程序select等待了多久

select成功時返回就緒(可讀,可寫,異常)文件描述符的總數。如果在超時時間內沒有任何文件描述符就緒,select將返回0.select失敗時返回-1並設置errno.如果
等待期間,程序接受信號,則select立即返回-1,並設置errno爲EINTR。

poll系統調用:在制定時間內輪詢一定數量的文件描述符,已測試其中是否有就緒者
poll原型:
#include<poll.h>
int poll(struct pollfd* fds,nfds_t nfds,int timeout);
fds參數是一個pollfd結構類型的數組,它指定所有我們感興趣的文件描述符上發生的可讀,可寫和異常等事件。
nfds參數指定被監聽事件集合fds的大小,其類型nfds_t定義:typedef unsigned long int nfds_t;
timeout參數指定poll的超時值,單位是毫秒。當timeout爲-1時,poll調用將永遠阻塞,知道某個事件發生;當timeout爲0時,poll調用立即返回

epoll系列系統調用:
epoll是linux特有的I/O複用函數
文件描述符(用來標識內核中的事件表)的創建有epoll_creat來完成:
#include<sys/epoll.h>
int epoll_creat(int size)
操作epoll內核時間表:
#include<sys/epoll.h>
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event)
fd參數是要操作的文件描述符,op參數則制定操作類型(EPOLL_CTL_ADD(往事件表中註冊fd上大的事件),EPOLL_CTL_MOD(修改fd上的註冊事件),EPOLL_CTL_DEL(刪除fd上的註冊事件))
event參數指定事件,它是epoll_event結構指針類型

epoll_wait函數:
epoll系列系統調用的主要接口是epoll_wait函數,它在一段超時時間內等待一組文件描述符上的事件
#include<sys/epoll.h>
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)
該函數成功時返回就緒的文件描述符的個數,失敗時返回-1並設置errno
maxevent參數指定最多監聽多少個事件,它必須大於0


epoll對文件描述符的操作有兩種模式
:LT(電平觸發)模式(默認工作模式)和ET(邊沿觸發)模式(高效工作模式)
LT:當epoll_wait檢測到其上有事件發生並將此事件通知應用程序後,應用程序可以不立即處理該事件,當應用程序下一次調用epoll_wait時,epoll_wait還會再次嚮應用程序通告此事件,直到該事件被處理
ET:當epoll_wait檢測到其上有事件發生並將此事件通知應用程序後,應用程序必須立即處理該事件,因爲後續的epoll_wait調用將不再向應用程序通知這一事件
EPOLLONESHOT事件


Select,poll和epoll的區別:

Linux高性能服務編程(I/O複用)

I/O複用的高級應用一:非阻塞connect
Connect出錯時的一種errno值:EINPROGRESS 這種錯誤發生在對非阻塞的socket調用connect,而連接又沒有立即建立時。
I/O複用的高級應用二:聊天室程序
客戶端功能:一是從標準輸入終端讀入用戶數據,並將用戶數據發送至服務器;二是往標準輸出終端打印服務器程序發送給它的數據。
服務器的功能:接受客戶數據,並把客戶數據發送給每一個登陸到該服務區器上的客戶端(數據發送者除外)
客戶端:使用poll同時監聽用戶輸入和網絡連接,並利用splice函數將用戶輸入內容直接定向到網絡連接上以發送之,從而實現數據零拷貝,提高程序執行效率。
服務器:使用poll同時監聽socket和連接socket,並且使用犧牲空間換取時間的策略來提高服務器性能。
I/O複用的高級應用三:****同時處理TCP和UDP服務
超級服務xinetd:同時管理多個子服務,即監聽多個端口
Xinetd採用/etc/xinetd.conf主配置文件和.etc.xinetd.d目錄下的自配置文件來管理所有服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章