libevent原始碼深度剖析十

2021-06-29 08:20:10 字數 2293 閱讀 3104

——支援i/o多路復用技術

張亮libevent的核心是事件驅動、同步非阻塞,為了達到這一目標,必須採用系統提供的i/o多路復用技術,而這些在windows、linux、unix等不同平台上卻各有不同,如何能提供優雅而統一的支援方式,是首要關鍵的問題,這其實不難,本節就來分析一下。

libevent支援多種i/o多路復用技術的關鍵就在於結構體eventop,這個結構體前面也曾提到過,它的成員是一系列的函式指標, 定義在event-internal.h檔案中:

[cpp]view plain

copy

struct

eventop ;  

在libevent中,每種i/o demultiplex機制的實現都必須提供這五個函式介面,來完成自身的初始化、銷毀釋放;對事件的註冊、登出和分發。

比如對於epoll,libevent實現了5個對應的介面函式,並在初始化時並將eventop的5個函式指標指向這5個函式,那麼程式就可以使用epoll作為i/o demultiplex機制了。

libevent把所有支援的i/o demultiplex機制儲存在乙個全域性靜態陣列eventops中,並在初始化時選擇使用何種機制,陣列內容根據優先順序順序宣告如下:

[cpp]view plain

copy

/* in order of preference */

static

const

struct

eventop *eventops = ;   

然後libevent根據系統配置和編譯選項決定使用哪一種i/o demultiplex機制,這段**在函式event_base_new()中:

[cpp]view plain

copy

base->evbase = null;  

for(i = 0; eventops[i] && !base->evbase; i++)    

可以看出,libevent在編譯階段選擇系統的i/o demultiplex機制,而不支援在執行階段根據配置再次選擇。

以linux下面的epoll為例,實現在原始檔epoll.c中,eventops物件epollops定義如下:

[cpp]view plain

copy

const

struct

eventop epollops = ;  

變數epollops中的函式指標具體宣告如下,注意到其返回值和引數都和eventop中的定義嚴格一致,這是函式指標的語法限制。

[cpp]view plain

copy

static

void

*epoll_init    (

struct

event_base *);  

static

intepoll_add    (

void

*, struct

event *);  

static

intepoll_del    (

void

*, struct

event *);  

static

intepoll_dispatch(

struct

event_base *, 

void

*, struct

timeval *);  

static

void

epoll_dealloc    (

struct

event_base *, 

void

*);  

那麼如果選擇的是epoll,那麼呼叫結構體eventop的init和dispatch函式指標時,實際呼叫的函式就是epoll的初始化函式epoll_init()和事件分發函式epoll_dispatch()了;

c++語言提供了虛函式來實現多型,在c語言中,這是通過函式指標實現的。對於各類函式指標的詳細說明可以參見文章:

同樣的,上面epollops以及epoll的各種函式都直接定義在了epoll.c原始檔中,對外都是不可見的。對於libevent的使用者而言,完全不會知道它們的存在,對epoll的使用也是通過eventop來完成的,達到了資訊隱藏的目的。

支援多種i/o demultiplex機制的方法其實挺簡單的,借助於函式指標就ok了。通過對源**的分析也可以看出,libevent是在編譯階段選擇系統的i/o demultiplex機制的,而不支援在執行階段根據配置再次選擇。

libevent原始碼深度剖析

序幕 張亮上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev pol...

libevent原始碼深度剖析

上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev poll sel...

libevent原始碼深度剖析

序幕 張亮上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev pol...