IO多路復用之epoll模型

2021-09-26 06:31:00 字數 3757 閱讀 8776

基於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模式只在兩種邊緣更改的時候觸發,對於讀事件只在核...