多路io轉接伺服器,不再由應用程式自己監聽客戶端鏈結,而由核心代為監聽
epoll可顯著提高在大量併發連線中只有少量活躍連線下cpu利用率原因如下:
- 復用檔案描述符集合傳遞結果
- 只遍歷被核心io事件喚醒而加入到佇列中的fd集合
水平觸發lt和邊沿觸發et
通常邊沿觸發和非阻塞io配合使用
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* events);
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
建立epoll控制代碼
#include
//int epoll_create (int size); //size 建議監聽數量,返回檔案描述符(描述符集合的根節點描述符)
控制epoll監聽的fd事件:註冊、修改、刪除
#include
intepoll_ctl
(int efd,
int op,
int fd,
struct epoll_event* events)
;// efd為根描述符
//op為動作,epoll_ctl_add, epoll_ctl_mod, epoll_ctl_del分別表示對fd進行的操作:註冊、修改、刪除
//event 表示檔案描述符fd的事件狀態
struct epoll_event
;typedef
union epoll_data_t
;
監聽
#include
intepoll_wait
(int epfd,
struct epoll_event* events,
int maxevents,
int timeout)
;// epfd
// events 事件集合,是結構體epoll_event陣列
// maxevents 事件集合size
// timeout -1: 阻塞等待,0:非阻塞等待,>0:等待時間(ms)
//psudocode
#include
伺服器監聽端檔案描述符 lfd
初始化epoll樹,獲取epoll樹根部epfd(根部檔案描述符)
將lfd加入到epoll樹?,監聽事件epollin
while(1)
epoll_wait監聽事件
檢查可讀事件集————遍歷
lfd可讀
accept連線請求並返回新cfd
將新cfd加入到epoll?上,監聽事件為epollin
其他fd(客戶端)可讀
buf接受events[i]
.fd資訊
將對應fd+event從epoll?上摘下
處理buf資訊(此處使用反射)
將fd+event新增到epoll?上,監聽可寫事件epollout
檢查可寫事件集合————遍歷
若檔案描述符可寫
寫回處理後資訊
將對應fd+event從epoll?上摘下
重新將fd+event新增到epoll樹上,監聽事件epollin
pthread的基本使用方法
今天寫了個程式,但是很鬱悶的是沒有得到預想的結果 pthread t tid int main void pthread attr t attr pthread attr init attr pthread attr setdetachstate attr,pthread create detach...
SeekBar的基本使用方法
seekbar的基本使用方法 a 什麼是 seekbar b 使用 seekbar 的步驟 i.在布局檔案當中宣告seekbar android layout width fill parent android layout height wrap content ii.實現 onseekbarch...
標籤的基本使用方法
用於執行中從opencms vfs動態包含檔案,包含的檔案被當成乙個請求的附加引數。使用一下一些屬性來標識要包含的物件檔名稱 如果這些屬性都沒有設定,標籤的標籤體將使用別的方法得到檔名稱.注意 如果不能通過上訴方法得到包含的檔名稱,就會呼叫 當前cmsrequestcontext的 geturi 方...