1. 程式人生 > >libevent學習之一:libevent原始碼的特點和結構

libevent學習之一:libevent原始碼的特點和結構

1.特點
Libevent是一個用於開發可擴充套件性網路伺服器的基於事件驅動(event-driven)模型的網路庫。Libevent有幾個顯著的特點: 
(1)事件驅動(event-driven),高效能;
(2)輕量級,專注於網路,不如 ACE 那麼臃腫龐大; 
(3)原始碼相當精煉、易讀; 
(4)跨平臺,支援 Windows、Linux、*BSD和 Mac Os; 
(5)支援多種I/O多路複用技術,epoll、poll、dev/poll、select和kqueue等; 
(6)支援I/O,定時器和訊號等事件; 
(7)採用Reactor模式;

Libevent 已經被廣泛的應用,作為底層的網路庫;比如 memcached、Vomit、Nylon、Netchat等等。

2.設計目標
Libevent是用於編寫高速可移植非阻塞IO應用的庫,其設計目標是:
可移植性:
速度:libevent嘗試使用每個平臺上最高速的非阻塞IO實現,並且不引入太多的額外開銷。
可擴充套件性:libevent被設計為程式即使需要上萬個活動套接字的時候也可以良好工作。
3.構成
libevent由下列元件構成:
evutil:用於抽象不同平臺網路實現差異的通用功能。
event和event_base:libevent的核心,為各種平臺特定的、基於事件的非阻塞IO後端提供抽象API,讓程式可以知道套接字何時已經準備好,可以讀或者寫,並且處理基本的超時功能,檢測OS訊號。
bufferevent:為libevent基於事件的核心提供使用更方便的封裝。除了通知程式套接字已經準備好讀寫之外,還讓程式可以請求緩衝的讀寫操作,可以知道何時IO已經真正發生。(bufferevent介面有多個後端,可以採用系統能夠提供的更快的非阻塞IO方式,如Windows中的IOCP。)
evbuffer:在bufferevent層之下實現了緩衝功能,並且提供了方便有效的訪問函式。
evhttp:一個簡單的HTTP客戶端/伺服器實現。
evdns:一個簡單的DNS客戶端/伺服器實現。
evrpc:一個簡單的RPC實現。

4.庫
建立libevent時,預設安裝下列庫:
libevent_core:所有核心的事件和緩衝功能,包含了所有的event_base、evbuffer、bufferevent和工具函式。
libevent_extra:定義了程式可能需要,也可能不需要的特定協議功能,包括HTTP、DNS和RPC。
libevent:這個庫因為歷史原因而存在,它包含libevent_core和libevent_extra的內容。不應該使用這個庫,未來版本的libevent可能去掉這個庫。
某些平臺上可能安裝下列庫:
libevent_pthreads:新增基於pthread可移植執行緒庫的執行緒和鎖定實現。它獨立於libevent_core,這樣程式使用libevent時就不需要連結到pthread,除非是以多執行緒方式使用libevent。
libevent_openssl:這個庫為使用bufferevent和OpenSSL進行加密的通訊提供支援。它獨立於libevent_core,這樣程式使用libevent時就不需要連結到OpenSSL,除非是進行加密通訊。

5.標頭檔案
libevent公用標頭檔案都安裝在event2目錄中,分為三類:
API標頭檔案:定義libevent公用介面。這類標頭檔案沒有特定字尾。
相容標頭檔案:為已廢棄的函式提供相容的頭部包含定義。不應該使用這類標頭檔案,除非是在移植使用較老版本libevent的程式時。這類標頭檔案具有後綴“_compat.h”
結構標頭檔案:這類標頭檔案以相對不穩定的佈局定義各種結構體。這些結構體中的一些是為了提供快速訪問而暴露;一些是因為歷史原因而暴露。直接依賴這類標頭檔案中的任何結構體都會破壞程式對其他版本libevent的二進位制相容性,有時候是以非常難以除錯的方式出現。這類標頭檔案具有後綴“_struct.h”。


--------------------- 
作者:燦哥哥 
來源:CSDN 
原文:https://blog.csdn.net/caoshangpa/article/details/52806746?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!