libevent与libev简介_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实现的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_65931372/article/details/123333095

智能推荐

【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService_java autoservice-程序员宅基地

文章浏览阅读1.4k次,点赞36次,收藏36次。SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其核心思想就是解耦。模块之间基于接口编程,模块之间不对实现类进行硬编码,当代码里涉及具体的实现类,就违反了可拔插的原则,为了实现在模块装配的时候能不在程序里动态指明,就需要spi了。这里我们要跟API区分开来,简单介绍一下API。_java autoservice

安装好git包后,但在vsc中却提示:“ 未找到 Git。请安装 Git,或在 “git.path“ 设置中配置“的解决处理办法_git path-程序员宅基地

文章浏览阅读5.8k次,点赞9次,收藏19次。安装好git包后,但在vsc中却提示:" 未找到 Git。请安装 Git,或在 "git.path" 设置中配置"的解决处理办法._git path

使用 VMware 安装 docker_vmware安装docker-程序员宅基地

文章浏览阅读9.3k次,点赞11次,收藏90次。在 VMware 虚拟机 linux 环境下安装 Docker,超详细流程_vmware安装docker

5mm方格本打印模板_聪明人的方格笔记术-程序员宅基地

文章浏览阅读2.8k次。我在学生时代,几乎所有的笔记本都是横线本,也是这两年先后发现了不同的笔记方式。上次去图书馆发现了《聪明人用方格笔记本》,顺手带回家放置了很久,终于决定不能再拖下去了,昨天用1个半小时看完了。很多人在学生阶段、工作阶段,都少不了记笔记的经历,那么你有没有想过,记笔记的目的是什么呢?笔记的生命线是“再现性”,这是记笔记的最终目的。 --by《聪明人用方格笔记本》做笔记的过程也是信息整理的过程,我们做笔..._5mm小格子怎么用

【C语言】拼接字符串_用vc6.0进行字符串的拼接代码-程序员宅基地

文章浏览阅读5.7k次,点赞6次,收藏28次。C语言之字符的拼接_用vc6.0进行字符串的拼接代码

数据如何埋点?Mob统计分析电商类APP埋点需求_软件埋点 如何报价-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏8次。1、明确核心业务主流程首次接入数据埋点,建议选择与产品核心业务最关联的业务流程进行分析例如:电商类APP的“购买流程”、“售后流程”金融类APP的“投资流程”、“新用户活动流程”咨询类APP的“文章阅读”、“分享&回流”2、确定用户执行主流程时各个关键行为点例如电商APP“购买流程”可分解如下几个关键行为点搜索商品查看商品详情选择收货人创建订单支付订单_软件埋点 如何报价

随便推点

人工智能:语音合成技术介绍_语音合成需要什么知识和技能-程序员宅基地

文章浏览阅读2.3k次,点赞17次,收藏22次。今天介绍给大家介绍语音合成相关的技术,希望对大家能有所帮助!语音合成简单来说就是把文字信息转换为标准语音的过程,最终可以输出对应的音频文件。可以实现让机器像人类一样可以实时的说话。涉及的领域有声学、语言学、数字信号处理、计算机管理等方面的知识。主要包括:获取输入的文本→语言处理→韵律处理→声学处理→输出音频文件。其中语音识别主要是语言处理、韵律处理、声学处理_语音合成需要什么知识和技能

高斯混合模型是什么?什么是软聚类?高斯混合模型还能做什么?_bayesiangaussianmixture-程序员宅基地

文章浏览阅读464次。sklearn.mixture.BayesianGaussianMixturesklearn.mixture.GaussianMixturefrom sklearn.mixture import GaussianMixturefrom sklearn.mixture import BayesianGaussianMixturefrom sklearn.datasets.samples_generator import make_blobsX, y = make_blobs(n_sam_bayesiangaussianmixture

2022最全最细软件测试工程师的职业规划和职业发展【入门篇】_测试工程师规划-程序员宅基地

文章浏览阅读4.2k次。由于种种原因,很多人选择了测试这个职业,在职场和测试领域当中几经风雨,有的人顺时应势走出了一片天地,有的人选择离开从事其他职业……笔者作为一个在测试行业略有想法的测试人员,对测试人员的职业规划和职业发展做一些总结和大致方向的展望,以此希望对刚选择测试职业的人,对那些在测试职业发展过程中看不清自己方向,比较迷茫的人,给出一些参考,可以让大家借鉴。大家的想法和心得体会彼此印证,从而在后续的生活和工作中,找到自己的发展方向和目标,并去坚持的走下去。本文分两个阶段描述测试人员的职业规划和职业发展,第_测试工程师规划

微内核 性能 ipc linux,微内核(microkernel)有关-程序员宅基地

文章浏览阅读227次。微内核(microkernel)相关from :http://www.yandong.org/archives/191介绍WIKI上的解释是:在计算机科学中,微内核是一个近乎最小的软件集合,但具有能够提供实现操作系统所需的机制。Incomputer science, amicrokernelis the near-minimum amount of software that can pr..._linux micro kernel

【Android 系统】--- Android代号、标记、细分版本号(超详细 持续更新中)_android 版本号-程序员宅基地

文章浏览阅读6.6k次,点赞2次,收藏8次。在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。_android 版本号

Python进阶----在线翻译器(Python3的百度翻译爬虫)_百度翻译 requests-程序员宅基地

文章浏览阅读2.3k次,点赞18次,收藏24次。基于百度翻译的PYthon在线翻译爬虫程序,详细解释每一个步骤,对爬虫爱好者和小白学习非常友好。学会这个,可以自己基于其他翻译网站进行编写在线翻译爬虫程序,此处也可以出了基于搜狗翻译的PYthon在线翻译爬虫程序。_百度翻译 requests

推荐文章

热门文章

相关标签