`
aigo
  • 浏览: 2635697 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

libuv 与 libev 的对比

 
阅读更多

原文:https://idndx.com/2013/01/05/comparison-between-libuv-and-libev/

 

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 下的库。

分享到:
评论

相关推荐

    事件库libev3.7

    **事件库libev3.7详解** libev是一个开源、跨平台的事件库,它提供了一个高度优化的事件循环机制,适用于处理大量的并发网络连接。libev的主要目标是实现一个高性能、灵活且易于使用的事件库,它在设计时充分考虑了...

    libhv libev libuv libevent 2020-08-28 最新源代码

    与libevent相比,libev更加专注于事件处理的基本功能,没有那么多额外的特性,因此在某些情况下可能更受青睐。 接下来是**libevent**,这是一个更全面的事件库,它不仅包含了libev的基本功能,还扩展了对HTTP、DNS...

    libuv中文教程.pdf

    与传统的阻塞式I/O调用不同,libuv允许程序发起一个异步操作,然后继续执行其他任务,直到这个操作完成,此时会通过事件循环机制调用相应的回调函数。这意味着程序可以并发地处理多个I/O请求,大大提高了I/O密集型...

    libuv-httpserver-源码.rar

    libuv通过libev或libeio等底层库来实现这些功能,确保在多平台上的兼容性。在libuv中,事件被抽象为handle(句柄)和request(请求)两种类型,handle负责注册事件和接收回调,request用于执行一次性任务。 二、...

    libuv开发说明中文版

    libuv的出现和发展与node.js密切相关。node.js最初使用了Google的V8引擎和Marc Lehmann的libev库。随着node.js的普及和跨平台需求的出现,以及libev无法在Windows上运行的限制,libuv应运而生。在node.js的v0.9.0...

    libuv 1.22.0动态链接库libuv.dll

    **libuv 1.22.0动态链接库libuv.dll详解** libuv是一个跨平台的异步I/O库,最初由Node.js项目开发并维护,现在已成为一个独立的开源库,广泛应用于需要高性能网络编程的场景。1.22.0是libuv在2018年7月发布的版本,...

    libuv book 中文文档 An introduction to libuv

    **标题与描述解析** 《libuv书中文文档:An introduction to libuv》是关于libuv库的一个详细介绍。libuv是一个跨平台的异步I/O库,主要用于构建高性能的网络和文件系统应用程序。这本书的中文版提供了对libuv的...

    libuv-vc6-master_libuv在xp下使用vc6.0_

    《在Windows XP下使用VC6.0与libuv的详细指南》 libuv是一个跨平台的异步I/O库,广泛应用于Node.js等项目中,提供了丰富的网络和操作系统接口。然而,随着技术的发展,现代软件通常不再支持Windows XP,但有些遗留...

    libuv封装,封装libuv网络库

    2. **定义数据结构**:封装 Libuv 需要创建与 Libuv 内部结构相对应的类或结构体。例如,可以创建一个 `UVConnection` 类来表示 TCP 连接,其中包含 Libuv 的 `uv_tcp_t` 结构体,并添加必要的方法和属性。 3. **...

    libevent_libev实战那些坑1

    《libevent与libev实战中的陷阱》 libevent和libev是两个被广泛使用的C语言实现的异步事件库,它们的主要任务是帮助开发者处理网络IO事件、定时事件和信号事件,以实现高效的非阻塞I/O。这两个库通过封装操作系统...

    编译好的libuv

    **编译好的libuv** Libuv是一个开源的、跨平台的异步I/O库,它在C语言中实现,但可以被多种编程语言所使用,如Node.js。这个压缩包包含的是已经编译好的libuv库,对于开发者来说,这意味着可以直接在项目中使用而...

    libuv源代码移植到CLion工程

    在IT行业中,libuv是一个非常重要的跨平台异步I/O库,主要用于处理各种操作系统下的网络和文件系统操作。它的设计目标是为Node.js提供底层支持,但也可以独立使用。CLion是一款由JetBrains公司开发的强大C/C++集成...

    libuv-1.37.0.zip

    libuv is a multi-platform support library with a focus on asynchronous I/O. It was primarily developed for use by [Node.js][], but it's also used by [Luvit](http://luvit.io/), [Julia]...

    libuv_tcp的基于libuv库的c++实现.zip

    在`tcpserver.cpp`中,主要涉及了libuv的TCP服务器的创建与管理。首先,需要初始化libuv的事件循环(Event Loop),这是libuv的核心部分,负责调度所有异步操作。接着,创建一个TCP服务器监听指定的端口,当有新的...

    VS2019编译好的libuv-v1.33.1库

    然而,需要注意的是,确保库与你的应用程序使用的 Visual Studio 版本、目标平台(x86/x64)和编译配置(Debug/Release)相匹配,否则可能会出现链接错误。 总之,Libuv v1.33.1 是一个强大的异步 I/O 库,适用于多...

    libuv中文学习指南

    - **定义与功能**:`libuv`是一个跨平台的异步I/O库,用于开发高性能的应用程序和服务。它提供了一套统一的API,使开发者能够在Windows和Unix等不同操作系统上编写一致的事件驱动型代码。 - **目标**:主要面向系统...

    libuv在centos下的编译安装.pdf

    在Linux操作系统中,尤其是在CentOS系统上,libuv库是一个高性能的跨平台异步I/O库。在进行服务器编程和网络编程中,libuv库为开发人员提供了方便处理异步事件和进行跨平台网络编程的能力。本文件将介绍如何在CentOS...

    libuv documentation.pdf

    该库提供了两种抽象来与事件循环交互:handles 和 requests。handles 代表长期存在的对象,能够执行特定的操作,而 requests 则是异步操作的表示。 libuv 的架构图如下所示: * Handles:长期存在的对象,能够执行...

    An Introduction to libuv

    “This ‘book’ is a small set of tutorials about using libuv [https://github.com/libuv/libuv] as a high performance evented I/O library which offers the same API on Windows and Unix. It is meant to ...

Global site tag (gtag.js) - Google Analytics