基於select和poll輪詢方式的低效性,epoll為了解決這個不足,應運而生,epoll可以告訴伺服器到底是哪些事件就緒了,epoll返回乙個事件集合陣列,告訴我們是前多少個事件就緒了,這樣我們只需要遍歷就緒事件集就可以了。就像我們學生向老師提問的案例一樣,當有若干學生向老師舉手時,老師把這些學生全部放到前三排的位置,然後告訴我們前三排的學生全部都是有問題的學生,我們只需回答前三排的學生的問題。
如果有10000個連線,但是9999個連線都傳送資料給伺服器了,select poll epoll 三者差不多
但是如果只有少數連線傳送資料epoll的優勢就體現出來了,而日常生活中這種情況很常見
epoll_create
構建一顆紅黑樹,返回根節點的檔案描述符
intepoll_create
(int size)
size:告訴核心監聽的數目
epoll_ctl
對紅黑樹的操作,增刪改
intepoll_ctl
(int epfd,
int op,
int fd, struct epoll_event *event)
epfd:為epoll_create的控制代碼
op:表示動作,用3個巨集來表示:
epoll_ctl_add
(註冊新的fd到epfd),
epoll_ctl_mod
(修改已經註冊的fd的監聽事件),
epoll_ctl_del
(從epfd刪除乙個fd);
fd:當前操作的檔案描述符
event:告訴核心需要監聽的事件
struct epoll_event
;typedef union epoll_data epoll_data_t;
events:
epollin :表示對應的檔案描述符可以讀(包括對端socket正常關閉)
epollout:表示對應的檔案描述符可以寫
epollpri:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來)
epollerr:表示對應的檔案描述符發生錯誤
epollhup:表示對應的檔案描述符被結束通話;
epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(level triggered)來
說的epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需
要再次把這個socket加入到epoll佇列裡
epoll_wait
int nready=
intepoll_wait
(int epfd, struct epoll_event *events,
int maxevents,
int timeout)
epfd:紅黑樹跟檔案描述符
events:從核心得到事件的集合,遍歷這個事件的前nready個元素即可
maxevents:告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create
()時的size,
timeout:是超時時間
-1:阻塞
0:立即返回,非阻塞
>
0:指定微秒
返回值:成功返回有多少檔案描述符就緒,時間到時返回0,出錯返回-
1
案例的示意圖如下
}客戶端
#include
#include
#include
#include
#include
#include
#include
#include
#define dest_port 9999
//目標位址埠號
#define dest_ip "127.32.255.2"
/*目標位址ip,這裡設為本機,不一定非得是127.0.0.1,只要127開頭並且不是127.0.0.0和127.255.255.255即可*/
#define max_data 100
//接收到的資料最大程度
intmain()
return0;
}
centos執行
gcc -o server.out server.c
gcc -o client.out client.c
得到執行檔案server.out,client.out
用xshell 對乙個虛擬機器開兩個item視窗,乙個執行./server.out ,另乙個執行./client.out,可以開多個客戶端通訊
高低電位,上公升沿,下降沿如圖所示
比如手機按鍵,不按的時候是高電位,按下去接地變成低電位,如果是按下按鍵觸發按鈕就是下降沿,如果是鬆開按鍵觸發按鈕就是上公升沿。
邊沿觸發的意思就是在上公升沿或者下降沿的瞬間觸發事件
水平觸發的意思就是在低電位的時候觸發。例如長按不鬆開
epoll事件有兩種模型:
edge triggered (et) 邊緣觸發只有資料到來,才觸發,不管快取區中是否還有資料。
level triggered (lt) 水平觸發只要有資料都會觸發。
et和lt例子1:
隔兩秒bbbb
隔兩秒cccc
lt模式輸出:
aaaa
bbbb
隔兩秒cccc
dddd
隔兩秒eeee
ffff
IO多路復用之epoll總結
epoll是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用乙個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的乙個事件表中,這樣在使用者空間和核心空間的copy只需一次。epol...
IO多路復用之epoll總結
1 基本知識 epoll是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用乙個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的乙個事件表中,這樣在使用者空間和核心空間的copy只需...
IO多路復用之epoll(二)
前一篇介紹了epoll的lt模式,lt模式注意epollout事件在資料全部寫成功後需要取消關注,或者更改為epollin。而這次epoll的et模式,要注意的是在讀和寫的過程中要在迴圈中寫完或者讀完所有資料,確保不要丟掉一些資料。因為epoll et模式只在兩種邊緣更改的時候觸發,對於讀事件只在核...