一亩冬、libevent是什么
libevent是一個輕量級的開源的高性能的事件觸發(fā)的網(wǎng)絡(luò)庫,適用于windows覆享、linux营袜、bsd等多種平臺,內(nèi)部使用select凤壁、epoll跪另、kqueue等系統(tǒng)調(diào)用管理事件機制。
它被眾多的開源項目使用免绿,例如大名鼎鼎的memcached等。
特點:
事件驅(qū)動淌哟,高性能;
輕量級,專注于網(wǎng)絡(luò)(相對于ACE);
開放源碼腐碱,代碼相當精煉掉弛、易讀;
跨平臺,支持Windows筒饰、Linux壁晒、BSD和Mac OS;
支持多種I/O多路復(fù)用技術(shù)(epoll业栅、poll、dev/poll携取、select和kqueue等)帮孔,在不同的操作系統(tǒng)下,做了多路復(fù)用模型的抽象晤斩,可以選擇使用不同的模型姆坚,通過事件函數(shù)提供服務(wù);
支持I/O,定時器和信號等事件;
采用Reactor模式;
二兔辅、下載
libevent1.4代碼量比較少,結(jié)構(gòu)比較簡單,也適合入門學(xué)習(xí),1.4很早以前看過了,大家想學(xué)習(xí)也可以學(xué)習(xí)1.4击喂。
這里學(xué)習(xí)的是libevent2.0以上版本。代碼量也比1.4高很多懂昂,也加了很多功能。
libevent下載:http://libevent.org/
我下載的是libevent-2.1.8-stable.tar.gz
下載之后解壓潮尝,然后進入目錄就可以安裝了。
[eric@localhost libevent-2.1.8-stable]$ ./configure
[eric@localhost libevent-2.1.8-stable]$ make
[eric@localhost libevent-2.1.8-stable]$ sudo make install
[eric@localhost libevent-2.1.8-stable]$ sudo ldconfig /usr/local/lib/libevent.so
我們可以看到有以下一些庫羹蚣。
libevent_core:所有核心的事件和緩沖功能乱凿,包含了所有的event_base徒蟆、evbuffer、bufferevent和工具函數(shù)段审。
libevent_extra:定義了程序可能需要,也可能不需要的協(xié)議特定功能抑淫,包括HTTP姥闪、DNS和RPC。
libevent:這個庫因為歷史原因而存在催式,它包含libevent_core和libevent_extra的內(nèi)容避归。不應(yīng)該使用這個庫,未來版本的libevent可能去掉這個庫喉童。
libevent_pthreads:添加基于pthread可移植線程庫的線程和鎖定實現(xiàn)顿天。它獨立于libevent_core,這樣程序使用libevent時就不需要鏈接到pthread咽白,除非是以多線程方式使用libevent鸟缕。
三排抬、libevent的功能授段。
Libevent提供了事件通知,io緩存事件届搁,定時器窍育,超時,異步解析dns表锻,事件驅(qū)動的http server以及一個rpc框架乞娄。
事件通知:當文件描述符可讀可寫時將執(zhí)行回調(diào)函數(shù)。
Io緩存:緩存事件提供了輸入輸出緩存码耐,能自動的讀入和寫入溶其,用戶不必直接操作io敦间。
定時器:libevent提供了定時器的機制,能夠在一定的時間間隔之后調(diào)用回調(diào)函數(shù)厢绝。
信號:觸發(fā)信號带猴,執(zhí)行回調(diào)。
異步的dns解析:libevent提供了異步解析dns服務(wù)器的dns解析函數(shù)集靶病。
事件驅(qū)動的http服務(wù)器:libevent提供了一個簡單的口予,可集成到應(yīng)用程序中的HTTP服務(wù)器。
RPC客戶端服務(wù)器框架:libevent為創(chuàng)建RPC服務(wù)器和客戶端創(chuàng)建了一個RPC框架煤辨,能自動的封裝和解封數(shù)據(jù)結(jié)構(gòu)。
四端三、Reactor(反應(yīng)器)模式
libevent是一個典型的reactor模式的實現(xiàn)鹃彻。這里做一下簡單介紹:
我們知道技肩,普通的函數(shù)調(diào)用機制如下:程序調(diào)用某個函數(shù),函數(shù)執(zhí)行浮声,程序等待虚婿,函數(shù)將結(jié)果返回給調(diào)用程序(如果含有函數(shù)返回值的話),也就是順序執(zhí)行的泳挥。
而Reactor模式的基本流程如下:應(yīng)用程序需要提供相應(yīng)的接口并且注冊到reactor反應(yīng)器上然痊,如果相應(yīng)的事件發(fā)生的話,那么reactor將自動調(diào)用相應(yīng)的注冊的接口函數(shù)(類似于回調(diào)函數(shù))通知你屉符,所以libevent是事件觸發(fā)的網(wǎng)絡(luò)庫剧浸。