libevent和libev都是c语言实现的异步事件库;通过注册异步事件,库检测事件触发,从而库根据
发生事件的先后顺序,调用相应回调函数进行处理;
事件包括:网络io事件,定时事件,信号事件;
事件循环:等待并分发事件;用于管理事件;
libevent 和 libev 主要封装了异步事件库与操作系统的交互;让用户不用关注平台的差异,只需着
手事件的具体处理;
libevent 和 libev 对window支持都比较差,因此产生 libuv 库,libuv 基于 libev,但是 window
上封装了 iocp;

区别

从设计理念出发,libev 是为了改进 libevent 中的一些架构决策,例如,全局变量的使用使得在多
线程环境中很难安全地使用 libevent,watcher 的数据结构设计太大,因为它们将 I/O、时间和信
号处理放在一个结构体中,额外的组件如 http 、dns、openssl, 服务器由于实现质量差以及由
此产生的安全问题,计时器不精确,不能很好地处理时间事件。
libev 通过不使用全局变量,而是对所有回调函数传参的方式传递上下文;并且根据不同事件类型
构建不同的数据结构,这样以来减低事件的耦合性;
libev 小而高效;只关注事件处理;

libevent的主要接口

// 初始化 libevent;对应理解 epoll_create
struct event_base *event_base_new(void);// 创建事件,初始化event和相应的回调函数
struct event * event_new(struct event_base *base, evutil_socket_t fd, short events, void     (*cb)(evutil_socket_t, short, void *), void *arg)// 设置事件
void event_set(struct event *ev, evutil_socket_t fd, short events,void (*callback)(evutil_socket_t, short, void *), void *arg)// 建立 event 与 event_base 的映射关系
int event_base_set(struct event_base *eb, struct event *ev);// 注册事件,包括时间事件;相当于 epoll_ctl;
int event_add(struct event *ev, const struct timeval *tv)// 注销事件
int event_del(struct event *ev)// 进入事件循环
int event_base_loop(struct event_base *base, int flags)

Libev

libev的主要数据结构

EV_WATCHER

/* shared by all watchers */
#define EV_WATCHER(type) \\
int active; /* 表示 watcher 是否活跃,active = 1 表示还没被 stop 掉 */ \\
int pending; /* 存储 watcher 在 pendings 中的索引。大于零表示还没被处理。
* watcher 的回调函数被调用后,会设置为 0。 */ \\
int priority; /* 事件的优先级 */ \\
void *data; /* 回调函数所需要的数据 */ \\
void (*cb)(EV_P_ struct type *w, int revents); /* 回调函数 */
作用:不同事件类型的共有信息。

ev_io

typedef struct ev_io
{
EV_WATCHER_LIST (ev_io)
int fd;
int events;
} ev_io;
// 作用:记录 IO 事件的基本信息。
// ev_io 相比 ev_watcher 增加了 next, fd, events 的属性。

ev_loop

struct ev_loop {
double ev_rt_now; /* 当前的时间戳 */
int backend; /* 采用哪种多路复用方式, e.g. SELECT/POLL/EPOLL */
int activecnt; /* total number of active events ("refcount") */
int loop_done; /* 事件循环结束的标志,signal by ev_break */
int backend_fd; /* e.g. epoll fd, created by epoll_create*/
void (*backend_modify)(EV_P_ int fd, int oev, int nev)); /* 对应 epoll_ctl */
void (*backend_poll)(EV_P_ ev_tstamp timeout)); /* 对应 epoll_wait */
void (*invoke_cb)(struct ev_loop *loop);
ANFD *anfds; /* 把初始化后的 ev_io 结构体绑定在 anfds[fd].head 事件链表上,方便根据 fd
直接查找。*/
int *fdchanges; /* 存放需要 epoll 监听的 fd */
ANPENDING *pendings [NUMPRI]; /* 存放等待被调用 callback 的 watcher */
} /
/ 作用:基本包含了 loop 循环所需的所有信息,为让注释更容易理解采用 epoll 进行说明

libev主要接口:

// 初始化 watcher 的 fd/events/callback
#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),
(fd),(events)); } while (0)// 注册并绑定 io watcher 到 ev_loop
void ev_io_start(struct ev_loop *loop, ev_io *w)// 注册并绑定 timer watcher 到 ev_loop
void ev_timer_start(struct ev_loop *loop, ev_timer *w)// 开启改 ev_loop 的事件循环
int ev_run(struct ev_loop *loop, int flags)

libenent 和libev相关推荐

  1. libev源码解析——定时器监视器和组织形式

    我们先看下定时器监视器的数据结构.(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based o ...

  2. libev源码解析——定时器原理

    本文将回答<libev源码解析--I/O模型>中抛出的两个问题.(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们 ...

  3. libev源码解析——I/O模型

    在<libev源码解析--总览>一文中,我们介绍过,libev是一个基于事件的循环库.本文将介绍其和事件及循环之间的关系.(转载请指明出于breaksoftware的csdn博客) 目前i ...

  4. libev源码解析——调度策略

    在<libev源码解析--监视器(watcher)结构和组织形式>中介绍过,监视器分为[2,-2]区间5个等级的优先级.等级为2的监视器最高优,然后依次递减.不区分监视器类型和关联的文件描 ...

  5. libev源码解析——监视器(watcher)结构和组织形式

    在<libev源码解析--总览>中,我们介绍了libev的一些重要变量在不同编译参数下的定义位置.由于这些变量在多线程下没有同步问题,所以我们将问题简化,所提到的变量都是线程内部独有的,不 ...

  6. libev源码解析——总览

    libev是个非常优秀的基于事件的循环库,很多开源软件,比如nodejs就是使用其实现基础功能.本系列将对该库进行源码分析.(转载请指明出于breaksoftware的csdn博客) 不知道是被墙了还 ...

  7. php libev pthreads,libuv 与 libev 的对比

    05 January 2013 libuv和libev,两个名字相当相近的 I/O Library,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述. ...

  8. CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()

    在CentOS Release 6.6安装percona-xtrabackup-2.3.4时,遇到下面错误信息 rpm -ivh percona-xtrabackup-2.3.4-1.el6.x86_ ...

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

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

最新文章

  1. 0xc000007b错误 - 解决方法备忘(vc red重装)
  2. Python 百度面试题
  3. img标签动态绑定本地图片地址不生效
  4. 浏览器加载渲染HTML、DOM、CSS、 JAVASCRIPT、IMAGE、FLASH、IFRAME、SRC属性等资源的顺序总结...
  5. has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present---nginx工作笔记006
  6. android 字体px转sp,Android中px,dp,sp区别及换算
  7. 【OCR技术】大批量生成文字训练集
  8. CCF201412-4 最优灌溉(100分)
  9. windows10环境下curl 安装与配置
  10. 用InkScape绘制中国人寿LOGO
  11. CVPR2021 | 记录SCRFD人脸检测C++工程化(含docker镜像)
  12. 【NLP】从WE、ELMo、GPT到Bert模型—自然语言处理中的预训练技术发展史
  13. shell pwd 和 dirname 讲解
  14. 蜂群思维三个关键词:群体智慧、分布式、涌现
  15. 发几张18650锂电池的放电曲线
  16. 2022年危险化学品经营单位安全管理人员考题及在线模拟考试
  17. 软考-信息系统项目管理师-项目沟通管理和干系人管理
  18. UG二次开发—VisualStudio开发环境及调试配置
  19. PHP 两个多维数组根据某个键的值进行组合排序的几种思路(二)
  20. Excel VBA 找出选定范围不重复值和重复值

热门文章

  1. 数字证书如何申请以及有什么要求
  2. NIO的原理和文件读入读出及图片拷贝的使用
  3. 小白180天学习笔记详解:零基础如何学习人工智能
  4. 华为应用市场携手全新BMW7系,开启“后排车载娱乐”时代
  5. 什么是云计算_什么是云?
  6. 转贴:精神病人笑话全集
  7. 单片机中段程序_单片机外部中断详解及程序
  8. python自动下单脚本
  9. 数据库系统原理填空题
  10. pandas学习笔记------set_index()