Libevent简介

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    他的简洁和精炼可以让我们很容易的在不通的应用场景中做出合适的扩展和相应的改变,我们甚至可以基于libevent来写自己的网络库(比如点击打开链接,一个基于libevent的事件编写的一个网络库,使用起来更方便更简单)。现在流行的网络库的基本原理都是libevent类似的机制,只是不同的封装添加了很多方便的网络工具而已。除此之外Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。

     Libevent提供了事件通知,io缓存事件,定时器,超时,异步解析dns等功能。

     libevent支持用户使用三种类型的事件,分别是网络IO、定时器、信号三种,最新版本在定时器的实现上使用了最小堆的数据结构,以达到高效查找、排序、删除定时器的目的,IO和信号的实现均使用了双向队列(用链表实现)。 Libevent定时器的数据结构为最小堆(Min Heap);网络IO和信号的数据结构采用了双向队列(TAILQ)。在实现上主要有3种链表: EVLIST_INSERTED, EVLIST_ACTIVE, EVLIST_TIMEOUT,一个ev在这3种链表之间被插入或删除,处于EVLIST_ACTIVE链表中的ev最后将会被调度执行。

     io缓存主要是evbuffer相关的,是libevent对网络io读写提供了缓冲功能,简化io读写操作,详细的后面讲。
     Libevent提供了DNS,HTTP Server,RPC等组件,HTTP Server可以说是Libevent的经典应用。从http.c可看到Libevent的很多标准写法。

     libevent是一个典型的reactor模式的实现。程序需要提供相应的接口并且注册到reactor反应器上,如果相应的事件发生的话,那么reactor将自动调用相应的注册的接口函数(类似于回调函数)通知你。

     Libevent默认情况下是单线程的(可以配置成多线程,如果有需要的话),每个线程有且只有一个event_base,对应一个struct event_base结构体(以及附于其上的事件管理器),用来schedule托管给它的一系列event,可以和操作系统的进程管理类比,当然,要更简单一点。当一个事件发生后,event_base会在合适的时间(不一定是立即)去调用绑定在这个事件上的函数(传入一些预定义的参数,以及在绑定时指定的一个参数),直到这个函数执行完,再返回schedule其他事件。

    

       

  

      

你可能感兴趣的:(linux)