libevent和libev都是c语言实现的异步事件库,主要封装了三个事件,让我们在开发时不需要关注网络IO事件对应的细节,以及定时事件中应使用的数据结构,以及何时调用定时任务,所以只需要关注简单的注册和回调流程。这三个事件是网络io事件,定时事件,信号事件。

libevent和libev区别

libev在libevent基础上做了一些优化。

多线程问题

libevent由于过度依赖全局变量,没有携带上下文信息,对多线程不太友好,需要考虑加锁的问题。libev在注册事件时携带了callback函数,把所需的上下文(具体的事件、事件所依赖的管理器如epoll)给携带过来,方便做多线程。

定时任务

libevent和libev都是使用最小堆来管理定时任务,区别在于libevent使用的是二叉树,而libev使用四叉树。这个区别在定时事件>50000时,libev会有5% 的性能提升。此外,libev定时器支持具体时间的设置。

额外的组件

libevent实现了很多http组件(如dns、openssl等),实现了很多具体的协议,杂糅在具体网络IO的封装中,而libev只关注网络事件的封装,包括bufferevnt和evconnlistener都没有。但是,作为优化,libev还是封装了libevent同样的接口。

对windows支持

libev对于windows的支持不太友好,主要体现在iocp上,因此有了libuv,在libev上封装了一层iocp。

libevent特点

bufferevent

封装了读缓冲区和写缓冲区,因此可以不用关注具体读写事件的差异。进一步管理读写事件,会提供三个回调:读回调、写回调、事件回调。

evconnlistener

封装了accpet()。
这里介绍一下accept()出错返回-1,errno=ENFILE的情况。此时fd数量达到上限,无法再创建fd。有几种解决方案:
1.重新设置fd上限。之前介绍过,不再赘述。
2.预先创建一个空fd。在一开始通过socket()创建一个空fd,不与任何连接绑定,当fd达到上限时,先关闭这个fd,再创建一个新的fd作为clientfd,告诉对端连接已满,再关闭这个连接,再建个空fd。
3.自己限制连接数。自己设置一个限制,要求连接数不超过某个值,这个值应小于系统的限制。
0.注意不能使用边沿触发。如果accpet()返回-1,就不会从全连接队列中取出连接。虽然epoll确实不会因为连接到达而继续触发,但是如果关闭了一些fd,可以建立新连接了,而此时epoll却因为边沿触发不会再被触发,即使有新连接到达。

libevent主要接口

注意与epoll接口对应,方便理解。

event_base_new

struct event_base *event_base_new(void);

初始化 libevent。对应 epoll_create()。

event_new

创建事件,初始化event和相应的回调函数。

struct event * event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg);

event_set

设置事件。

void event_set(struct event *ev, evutil_socket_t fd, short events,void (*callback)(evutil_socket_t, short, void *), void *arg);

event_base_set

建立 event 与 event_base 的映射关系。

int event_base_set(struct event_base *eb, struct event *ev);

event_add

注册事件,包括时间事件。

int event_add(struct event *ev, const struct timeval *tv);

注意添加事件之前,需要先event_base_set()绑定,将事件绑定在管理器上。

event_del

注销事件。

int event_del(struct event *ev);

以上四个函数对应epoll_ctl()。

event_base_loop

进入事件循环。相当于epoll_wait()。

int event_base_loop(struct event_base *base, int flags);

libev

libev的队列

libev有多个队列:
注册队列:将IO事件放在里面。检测到事件后就放到就绪队列中。
就绪队列:包括IO事件、定时器事件。会在event_base_loop中()依次调用,会调用这些事件的回调函数,这些回调函数不能是阻塞函数,否则会影响其他IO的处理。
堆队列:把定时器放到这个最小堆中。

libev数据结构

libev只保留了最基础的数据结构:网络IO、定时器事件、信号事件,目标是成为unix系统中的工具集。

libev主要接口

#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)

初始化 watcher 的 fd/events/callback。

void ev_io_start(struct ev_loop *loop, ev_io *w);

把事件绑定到ev_loop(事件管理器,相当于event_base)中。

void ev_timer_start(struct ev_loop *loop, ev_timer *w);

把定时器事件绑定到事件管理器中。

int ev_run(struct ev_loop *loop, int flags);

开启事件循环,相当于epoll_wait()中的事件循环。
最后再提示一下,libev还封装了与libevent一样的接口,只不过里面是由libev实现的。

libevent与libev简介相关推荐

  1. 使用 libevent 和 libev 提高网络应用性能

    简介 许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接.无论是通过构建基于云的服务来处理网络通信流,还是把应用程序分布在 IBM Amazon EC 实例上,还是为 ...

  2. 网络库libevent、libev、libuv、libhv对比

    网络库libevent.libev.libuv对比_小麒麟的成长之路-CSDN博客_libevent libuv Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asyn ...

  3. 偷懒的网络框架libevent、libev框架介绍

    libevent.libev框架介绍 前言 概述 libevent 编译安装libevent libevent的封装层次 IO事件检测的封装与api介绍 事件管理器event_base `构建事件管理 ...

  4. 网络库libevent、libev、libuv对比

    Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library). 异步事件库本质上是提供异步事件通知(Asynchronous Ev ...

  5. libevent和libev的区别对比(二)

    之前有一篇文章描述过一些对比: http://www.cnblogs.com/charlesblc/p/6078029.html 这里在代码和应用方面再说一下. 看一下两边的Helloworld基本就 ...

  6. Libevent教程001: 简介与配置

    本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...

  7. [zz]libev 简介

    1 libev libev所实现的功能就是一个强大的reactor,可能notify事件主要包括下面这些: ev_io // IO可读可写 ev_stat // 文件属性变化 ev_async // ...

  8. Libevent库的简介

    一.libevent是什么 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE ...

  9. libev libevent简介

    最近开始重构定制公司的网站后台服务器,开始关注libevent 以及livev 相关 ,也欢迎相关的同学一起讨论.这两者采用相同的架构和设计思想,很多原理和代码都可以相互参考和对比理解. 简介 lib ...

最新文章

  1. gtk linux 升级_需要在Ubuntu上更新GTK(10.04)
  2. YII2源码阅读:autoload_real.php 22~23行
  3. java的Deque栈_Java使用Deque实现堆栈的方法
  4. [Servlet]研究ServletContext对象
  5. 前端学习(1950)vue之电商管理系统电商系统之渲染添加父类的对话框
  6. python中execute函数_Python中的函数定义与参数使用
  7. mysql居左查询abcd_数据库--查询语句
  8. TCP的三次握手过程与四次挥手
  9. springdataRedis连接redis集群
  10. 单例模式-双重检查加锁
  11. 微信 账户升级服务器地址,微信支付商户平台账户升级后有哪些新功能呢?
  12. Arm 架构下的中断
  13. web调试代理工具Whistle
  14. oracle excel vba6,vba6.dll下载
  15. 利用pytesseract进行图片文字识别
  16. ArcMap下停靠栏的设计与实现
  17. 区块链对于相关流程和环节的联系,让元宇宙不再是虚无缥缈的概念
  18. HDU - 1546 Idiomatic Phrases Game(dijkstra最短路)
  19. Android 100元平板也能吃鸡玩王者!小米平板刷机神盾dot1.2保姆级教程。
  20. xutils获取数据

热门文章

  1. 神经网络的Backbone
  2. 1200w流量增长,精准拿捏B站涨粉又热门的爆款秘籍!
  3. datePicker设置时间范围
  4. python isnull的使用
  5. Alta PCI-1553B的BC端操作——认识Alta卡
  6. ASP.NET Identity简介及简单使用
  7. 基于Python实现个人手机定位分析
  8. 达观财务报表解析与核查系统助力金融企业财报管理变革
  9. DirectX12 - Command List(命令列表)
  10. html3d上下翻转4面效果,纯CSS 3D翻转一个面(翻转导航菜单 立方体)