1. 程式人生 > >網路程式設計——17. 優於select的epoll

網路程式設計——17. 優於select的epoll

select函式實現IO複用,但不適合以Web伺服器端開發為主流的現代開發環境

17.1 epoll理解及其應用

基於select的IO複用技術速度慢的原因

不合理的兩點:
1。呼叫select函式後常見的針對所有檔案描述符的迴圈語句
2。每次呼叫select函式時都需要向該函式傳遞監視物件資訊——致命弱點。
在這裡插入圖片描述

select函式的優點

有兩點:
1。伺服器端接入者少
2。程式應具有相容性

實現epoll時必要的函式和結構體

epoll函式優點:
1。無需編寫以監視狀態變化為目的的針對所有檔案描述符的迴圈語句
2。呼叫對應於select函式的epoll_wait函式時無需每次傳遞監視物件資訊

需要3個函式:
1- epoll_create:建立儲存epoll檔案描述符的空間。epoll方式下由作業系統負責儲存監視物件檔案描述符,因此需要向作業系統請求建立儲存檔案描述符的空間。
2- epoll_ctl:向空間(位陣列)註冊並登出檔案描述符,為了新增和刪除監視物件檔案描述符。
3- epoll_wait:等待檔案描述符發生變化

epoll方式通過如下結構體epoll_event將發生變化的檔案描述符單獨集中到一起。
在這裡插入圖片描述

epoll_create

函式原型
在這裡插入圖片描述
所建立的檔案描述符儲存空間稱為“epoll例程”,該函式建立的資源與套接字一樣,也由作業系統管理。需要終止時,與其他檔案描述符相同,也要呼叫close函式

epoll_ctl

生成epoll例程後,應在其內部註冊監視物件檔案描述符
在這裡插入圖片描述

常用的第二個引數:
1。EPOLL_CTL_ADD:將檔案描述符註冊到epoll例程
2。EPOLL_CTL_DEL:從epoll例程中刪除檔案描述符,此時第四個引數應為NULL
3。EPOLL_CTL_MOD:更改註冊的檔案描述符的關注事件發生情況

舉例
epoll_ctl(A, EPOLL_CTL_ADD, B, C);
代表epoll例程A中註冊檔案描述符B,主要目的是監視引數C中的事件。
epoll_ctl(A, EPOLL_CTL_DEL, B, NULL);
從epoll例程A中刪除檔案描述符B
在這裡插入圖片描述

epoll_wait

與select函式對應的epoll_wait函式
在這裡插入圖片描述
在這裡插入圖片描述

17.2 條件觸發和邊緣觸發

條件觸發方式中,只要輸入緩衝有資料就會一直通知該事件
而邊緣觸發方式中,輸入緩衝收到資料時僅註冊1次該事件,即使輸入緩衝中還留有資料,也不會再進行註冊