zoukankan      html  css  js  c++  java
  • libevent概述

    1. libevent简介

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

    Libevent已经被广泛的应用,作为底层的网络库;比如memcached、Vomit、Nylon、Netchat等等

    2. Reactor的事件处理机制

    Reactor释义“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。使用Libevent也是想Libevent框架注册相应的事件和回调函数;当这些时间发声时,Libevent会调用这些回调函数处理相应的事件(I/O读写、定时和信号)。

        用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。

        举个例子:你去应聘某xx公司,面试结束后。

    “普通函数调用机制”公司HR比较懒,不会记你的联系方式,那怎么办呢,你只能面试完后自己打电话去问结果;有没有被录取啊,还是被据了;

    3 . Reactor模式的优点

    Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点

        1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
        2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
        3)可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;
        4)可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;

    4. Reactor模式的缺点

       1)相比传统的模型,Reactor增加了一定的复杂性,因而具有一定的门槛,并且不易于调试。

       2)Reactor模式需要底层的Synchronous Event Demultiplexer支持,比如Java中的Selector支持,操作系统的select系统调用支持。

       3)Reactor模式在IO读写数据时会在同一线程中实现,即使使用多个Reactor机制的情况下,那些共享一个Reactor的Channel如果出现一个长时间的数据读写,会影响这  个  Reactor中其他Channel的相应时间。例如在大文件传输时,IO操作会影响其他客户端的时间,因而对于这种操作,使用传统的Thread-Per-Connection或许是一个更好的选择,或者采用Proactor模式。

    4. Reactor模式框架

     使用Reactor模型,必备的几个组件:事件源、Reactor框架、多路复用机制和事件处理程序,先来看看Reactor模型的整体框架,接下来再对每个组件做逐一说明。

    1) 事件源
    Linux上是文件描述符,Windows上就是Socket或者Handle了,这里统一称为“句柄集”;程序在指定的句柄上注册关心的事件,比如I/O事件。

    2) event demultiplexer——事件多路分发机制
    由操作系统提供的I/O多路复用机制,比如select和epoll。
        程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上;
    当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集中,一个或多个句柄的事件已经就绪”;
        程序收到通知后,就可以在非阻塞的情况下对事件进行处理了。
    对应到libevent中,依然是select、poll、epoll等,但是libevent使用结构体eventop进行了封装,以统一的接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的。

    3) Reactor——反应器
        Reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件;并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。
    对应到libevent中,就是event_base结构体。
    一个典型的Reactor声明方式

    5. Reactor事件处理流程

    前面说过Reactor将事件流“逆置”了,那么使用Reactor模式后,事件控制流是什么样子呢?
    可以参见下面的序列图。

  • 相关阅读:
    函数柯里化
    常用正则
    校验table行内的form编辑
    前端代码 读取excel表格数据
    cocos2d-x 帧动画学习
    Linux 下vim配置
    Android开发笔记 二
    cocos2d-x CCDictionary类学习
    Android开发笔记
    Cococs2d-x移植到Window下的问题
  • 原文地址:https://www.cnblogs.com/mysky007/p/12290538.html
Copyright © 2011-2022 走看看