libevent

libevent

Libevent 是一個用C語言編寫的、輕量級的開源高性能事件通知庫,主要有以下幾個亮點:事件驅動( event-driven),高性能;輕量級,專注於網路,不如 ACE 那么臃腫龐大;原始碼相當精煉、易讀;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多種 I/O 多路復用技術, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定時器和信號等事件;註冊事件優先權。

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

基本介紹

  • 外文名:libevent
  • 性質:用C語言編寫
  • 屬於:開源高性能事件通知庫
  • 支持:多種 I/O 多路復用技術
簡介,詳細,多執行緒,使用程式,主要組成,

簡介

libevent是一個事件通知庫,適用於windows、linux、bsd等多種平台,內部使用select、epoll、kqueue、IOCP等系統調用管理事件機制。著名分散式快取軟體memcached也是基於libevent,而且libevent在使用上可以做到跨平台,而且根據libevent官方網站上公布的數據統計,似乎也有著非凡的性能。

詳細

編譯庫代碼,編譯腳本會判斷OS支持哪種類型的事件機制(select、epoll或kqueue),然後條件編譯相應代碼,供上層使用的接口仍然是保持統一的(否則也不能所謂的跨平台了)。在linux redhat as 4 u 2 上編譯相當容易,configure以後make,make install就可以了,windows上編譯似乎有點小麻煩,不過稍微改點東西也就通過了。
從代碼中看,libevent支持用戶使用三種類型的事件,分別是網路IO、定時器、信號三種,最新版本在定時器的實現上使用了最小堆的數據結構,以達到高效查找、排序、刪除定時器的目的,IO和信號的實現均使用了雙向佇列(用鍊表實現)。網路IO上,主要關注了一下linux上的epoll(因為目前的開發主要在linux平台),結果發現libevent的epoll居然用的EPOLLLT,水平觸發的方式用起來比較方便,不容易出錯,但是在效率上可能比EPOLLET要低一些。
Libevent定時器的數據結構自version 1.4起已由紅黑樹改為最小堆(Min Heap),以提高效率;網路IO和信號的數據結構採用了雙向佇列(TAILQ)。在實現上主要有3種鍊表: EVLIST_INSERTED, EVLIST_ACTIVE, EVLIST_TIMEOUT,一個ev在這3種鍊表之間被插入或刪除,處於EVLIST_ACTIVE鍊表中的ev最後將會被調度執行。
Libevent提供了DNS,HTTP Server,RPC等組件,HTTP Server可以說是Libevent的經典套用。從http.c可看到Libevent的很多標準寫法。寫非阻塞式的HTTP Server很容易將socket處理與HTTP協定處理糾纏在一起,Libevent在這點上似乎也有值得推敲的地方。

多執行緒

libevent支持多執行緒編程,每個事件需要關聯到自己的event_base。

使用程式

Chromium、Memcached、NTP、HTTPSQS等著名的開源程式都使用libevent庫,足見libevent的穩定。更多使用libevent的程式可以到libevent的官網查看。

主要組成

libevent包括事件管理、快取管理、DNS、HTTP、快取事件幾大部分。事件管理包括各種IO(socket)、定時器、信號等事件;快取管理是指evbuffer功能;DNS是libevent提供的一個異步DNS查詢功能;HTTP是libevent的一個輕量級http實現,包括伺服器和客戶端。libevent也支持ssl,這對於有安全需求的網路程式非常的重要,但是其支持不是很完善,比如http server的實現就不支持ssl。

相關詞條

熱門詞條

聯絡我們