libevent与libev简介
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简介相关推荐
- 使用 libevent 和 libev 提高网络应用性能
简介 许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接.无论是通过构建基于云的服务来处理网络通信流,还是把应用程序分布在 IBM Amazon EC 实例上,还是为 ...
- 网络库libevent、libev、libuv、libhv对比
网络库libevent.libev.libuv对比_小麒麟的成长之路-CSDN博客_libevent libuv Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asyn ...
- 偷懒的网络框架libevent、libev框架介绍
libevent.libev框架介绍 前言 概述 libevent 编译安装libevent libevent的封装层次 IO事件检测的封装与api介绍 事件管理器event_base `构建事件管理 ...
- 网络库libevent、libev、libuv对比
Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library). 异步事件库本质上是提供异步事件通知(Asynchronous Ev ...
- libevent和libev的区别对比(二)
之前有一篇文章描述过一些对比: http://www.cnblogs.com/charlesblc/p/6078029.html 这里在代码和应用方面再说一下. 看一下两边的Helloworld基本就 ...
- Libevent教程001: 简介与配置
本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...
- [zz]libev 简介
1 libev libev所实现的功能就是一个强大的reactor,可能notify事件主要包括下面这些: ev_io // IO可读可写 ev_stat // 文件属性变化 ev_async // ...
- Libevent库的简介
一.libevent是什么 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE ...
- libev libevent简介
最近开始重构定制公司的网站后台服务器,开始关注libevent 以及livev 相关 ,也欢迎相关的同学一起讨论.这两者采用相同的架构和设计思想,很多原理和代码都可以相互参考和对比理解. 简介 lib ...
最新文章
- gtk linux 升级_需要在Ubuntu上更新GTK(10.04)
- YII2源码阅读:autoload_real.php 22~23行
- java的Deque栈_Java使用Deque实现堆栈的方法
- [Servlet]研究ServletContext对象
- 前端学习(1950)vue之电商管理系统电商系统之渲染添加父类的对话框
- python中execute函数_Python中的函数定义与参数使用
- mysql居左查询abcd_数据库--查询语句
- TCP的三次握手过程与四次挥手
- springdataRedis连接redis集群
- 单例模式-双重检查加锁
- 微信 账户升级服务器地址,微信支付商户平台账户升级后有哪些新功能呢?
- Arm 架构下的中断
- web调试代理工具Whistle
- oracle excel vba6,vba6.dll下载
- 利用pytesseract进行图片文字识别
- ArcMap下停靠栏的设计与实现
- 区块链对于相关流程和环节的联系,让元宇宙不再是虚无缥缈的概念
- HDU - 1546 Idiomatic Phrases Game(dijkstra最短路)
- Android 100元平板也能吃鸡玩王者!小米平板刷机神盾dot1.2保姆级教程。
- xutils获取数据