libev和libuv的区别

news/2024/7/9 16:54:38 标签: c/c++, epoll, 运维

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

高性能网络编程这个话题已经被讨论烂了。异步,异步,还是异步。不管是 epoll 也好,kqueue 也罢,总是免不了异步这个话题。

libev 是系统异步模型的简单封装,基本上来说,它解决了 epoll ,kqueuq 与 select 之间 API 不同的问题。保证使用 livev 的 API 编写出的程序可以在大多数 *nix 平台上运行。但是 libev 的缺点也是显而易见,由于基本只是封装了 Event Library,用起来有诸多不便。比如 accept(3) 连接以后需要手动 setnonblocking 。从 socket 读写时需要检测 EAGAIN 、EWOULDBLOCK 和 EINTER 。这也是大多数人认为异步程序难写的根本原因。

libuv 则显得更为高层。libuv 是 joyent 给 Node 做的一套 I/O Library 。而这也导致了 libuv 最大的特点就是处处回调。基本上只要有可能阻塞的地方,libuv 都使用回调处理。这样做实际上大大减轻了程序员的工作量。因为当回调被 call 的时候,libuv 保证你有事可做,这样 EAGAIN 和 EWOULDBLOCK 之类的 handle 就不是程序员的工作了,libuv 会默默的帮你搞定。

libev 在 socket 发生读写事件时,只告诉你,“XX socket 可以读/写了,自己看着办吧”。往往我们需要自己申请内存并调用 read(3) 或者 write(3) 来响应 I/O 事件。

libuv 则稍微复杂一些,我们分读/写两个部分来描述。

当接口可读时,libuv 会调用你的 allocate callback 来申请内存并将读到的内容写入。当读取完毕后,libuv 会 call 你为这个 socket 设置的回调函数,在参数中带着这个 buffer 的信息。你只需要负责处理这个 buffer 并且free 掉就OK了。因为是从 buffer 中读取数据,在你的 callback 被调用时数据已经 ready 了,所以程序员也就不用考虑阻塞的问题了。

而对写的处理则更显巧妙。libuv 没有 write callback ,如果你想写东西,直接 generate 一个 write request 连着要写的 buffer 一起丢给 libuv ,libuv 会把你的 write request 加进相应 socket 的 write queue ,在 I/O 可写时按顺序写入。

C 没有闭包,所以确定读写上下文是 libuv 的使用者需要面对的问题。否则程序面对汹涌而来的 buffer 也不能分得清哪个是哪个的数据。在这一点的处理上,libuv 跟 libev 一样,都是使用了一个 void *data 来解决问题。你可以用 data 这个 member 存储任何东西,这样当 buffer 来的时候,只需要简单的把 data cast 到你需要的类型就 OK 了。

libev 没有异步 DNS 解析,这一点一直广为垢病。

libuv 有异步的 DNS 解析,解析结果也是通过回调的方式通知程序。

libev 完全是单线程的。

libuv 需要多线程库支持,因为其在内部维护了一个线程池来 handle 诸如 getaddrinfo(3) 这样的无法异步的调用。

libev 貌似是作者一个人在开发,版本管理使用的还是 CVS ,社区参与度明显不高。

libuv 社区十分活跃,几乎每天都有人提出 Issue 并贡献代码。

libev 不支持 IOCP ,如果需要在 Win 下运行的程序会很麻烦。

libuv 支持 IOCP ,有相应脚本编译 Win 下的库。


http://www.niftyadmin.cn/n/1120866.html

相关文章

文件特殊权限suid、sgid、stick_bit、软链接、硬链接

2019独角兽企业重金招聘Python工程师标准>>> 第二章 文件、目录管理 2.18 特殊权限之 suid SUID的作用就是:让本来没有相应权限的用户运行这个程序时,可以访问没有权限访问的资源。passwd是一个很鲜明的例子。 suidset uid # umask 0022umask…

vue路由配置

1、安装路由,因为路由是vue的一个插件。 npm (cnpm) install vue-router -D 2、在main.js中引入路由 import Vue form vue import VueRouter from vue-router Vue.use(VueRouter) 3、在main.js中配置路由 import Vue from vue import App from ./App.vue // 引入路由…

iClap的名字是怎么来的,clap是有什么特殊的意义么?

iClap的名字来源于:Clap中文是鼓掌的意思,鼓掌代表合拍,一个团队的价值观以及工作方式合拍,是最重要的,当项目启动时,大家对产品认可,鼓掌开始实施;当项目成功上线,团队也…

使用MVCJqGrid的心得

最近公司网站进行升级,项目要用.net mvc,mysql和轻量级orm框架dapper。由于美工页面出不来啊,让我先写简单写写后台的列表,同事说用MvcJqGrid,也得到了架构的同意。 可是不得不说这个相关文档真不多啊,以前…

Swift中通过运行时实现全屏的pop功能

最近碰见个小的功能需求,就是需要给push的视图控制器添加一个侧滑pop弹出的功能,找了点资料,发现一个比较不错的解决办法,用了相识已久,但是没用过的运行时功能来实现。 具体思路如下: push到 UINavigation…

AWS认证权威考经(助理级认证篇)

笔者作为AWS官方认证的早期通过者,已经拿到了AWS的助理级解决方案架构师、开发者认证,系统管理员认证。这几年也陆续指导公司多人通过AWS的认证。本篇文章将分享如何通过自学的方式轻松通过AWS的助理级架构师、开发者和系统管理员认证。 为什么要考证 在…

文本文件内容相关命令

1、查看文本文件内容命令cat 命令格式:cat [option] filename cat命令常用的选项只有v,其功能是显示文件内容的同时,也显示文件中的控制字符,这个选项可以非常方便的查看脚本中不能识别的控制字符。 2、从文本尾查看文本内容命令t…

转载 - Linux TC(Traffic Control)框架原理解析

近日的工作多多少少和Linux的流控有点关系,自打几年前知道有TC这么一个玩意儿并且多多少少理解了它的原理之后,我就没有再动过它,因为我不喜欢TC命令行,实在是太繁琐了,iptables命令行也比较繁琐,但是比TC命…