libevent - 開源高性能網(wǎng)絡庫
Libevent是一個用C語言編寫的、輕量級的開源高性能網(wǎng)絡庫,主要有以下幾個亮點:事件驅動(event-driven),高性能;輕量級,專注于網(wǎng)絡,不如ACE那么臃腫龐大;源代碼相當精煉、易讀;跨平臺,支持Windows、Linux、BSD和Mac Os;支持多種I/O多路復用技術,epoll、poll、dev/poll、select和kqueue等;支持I/O,定時器和信號等事件;注冊事件優(yōu)先級。Libevent已經(jīng)被廣泛的應用,作為底層的網(wǎng)絡庫;比如memcached、Vomit、Nylon、Netchat等等。
簡介
libevent是一個事件觸發(fā)的網(wǎng)絡庫 ,適用于windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統(tǒng)調用管理事件機制。著名分布式緩存軟件memcached也是基于libevent,而且libevent在使用上可以做到跨平臺,而且根據(jù)libevent官方網(wǎng)站上公布的數(shù)據(jù)統(tǒng)計,似乎也有著非凡的性能。
詳情
編譯庫代碼,編譯腳本會判斷OS支持哪種類型的事件機制(select、epoll或kqueue),然后條件編譯相應代碼,供上層使用的接口仍然是保持統(tǒng)一的(否則也不能所謂的跨平臺了)。在linux redhat as4u2上編譯相當容易,configure以后make,make install就可以了,windows上編譯似乎有點小麻煩,不過稍微改點東西也就通過了。
從代碼中看,libevent支持用戶使用三種類型的事件,分別是網(wǎng)絡IO、定時器、信號三種,最新版本在定時器的實現(xiàn)上使用了最小堆的數(shù)據(jù)結構,以達到高效查找、排序、刪除定時器的目的,IO和信號的實現(xiàn)均使用了雙向隊列(用鏈表實現(xiàn))。網(wǎng)絡IO上,主要關注了一下linux上的epoll(因為目前的開發(fā)主要在linux平臺),結果發(fā)現(xiàn)libevent的epoll居然用的EPOLLLT,水平觸發(fā)的方式用起來比較方便,不容易出錯,但是在效率上可能比EPOLLET要低一些。
Libevent定時器的數(shù)據(jù)結構自version1.4起已由紅黑樹改為最小堆(Min Heap),以提高效率;網(wǎng)絡IO和信號的數(shù)據(jù)結構采用了雙向隊列 - TAILQ。在實現(xiàn)上主要有3種鏈表:EVLIST_INSERTED,EVLIST_ACTIVE,EVLIST_TIMEOUT,一個ev在這3種鏈表之間被插入或刪除,處于EVLIST_ACTIVE鏈表中的ev最后將會被調度執(zhí)行。
Libevent提供了DNS,HTTP Server,RPC等組件,HTTP Server可以說是Libevent的經(jīng)典應用。從http.c可看到Libevent的很多標準寫法。寫非阻塞式的HTTP Server很容易將socket處理與HTTP協(xié)議處理糾纏在一起,Libevent在這點上似乎也有值得推敲的地方。
多線程
libevent支持多線程編程,每個事件需要關聯(lián)到自己的event_base。
使用程序
Chromium、Memcached、NTP、HTTPSQS等著名的開源程序都使用libevent庫,足見libevent的穩(wěn)定。更多使用libevent的程序可以到libevent的官網(wǎng)查看。
主要組成
libevent包括事件管理、緩存管理、DNS、HTTP、緩存事件幾大部分。事件管理包括各種IO(socket)、定時器、信號等事件;緩存管理是指evbuffer功能;DNS是libevent提供的一個異步DNS查詢功能;HTTP是libevent的一個輕量級http實現(xiàn),包括服務器和客戶端。libevent也支持ssl,這對于有安全需求的網(wǎng)絡程序非常的重要,但是其支持不是很完善,比如http server的實現(xiàn)就不支持ssl。
