libuv 基本概念

        libuv是一个跨平台库,是围绕着事件驱动的异步I/O模型来设计的。 

        本库不止提供了对不同I/O polling机制的抽象,handles和streams机制也提供了一个更高层的对于sockets和其他实体的抽象。本库还提供了跨平台的文件I/O操作及线程功能。

  1. 最底层的socket相关操作有epoll/kqueue和event ports,这些事基于unix like系统的,在这些系统特定的API之上抽象出了一层uv_io_t结构用于提供统一的unix-like平台上的socket及事件接口。
  2. epoll ->linux内核;kqueue->freeBSD 4.1之后;event ports->貌似也是用在linux上的机制。
  3. IOCP为windows上特有的异步I/O事件模型,libuv也是支持的。着也就是libuv好于libev的地方。
  4. 此外libuv还支持线程池。
  5. 在上述底层抽象之上,libuv提供了更高一层的抽象,提供了抽象了的TCP/UDP/TTY/PIPE等接口。
  6. 在这些接口之上提供了文件I/O操作,DNS操作等。
  7. 用户可以基于上述的全部抽象接口实现自己的应用程序。 

        句柄和请求

        libuv给用户提供了两种方式与event loop一起协同工作,一个是句柄(handle)一个是请求(request)。 

       句柄代表了一个长期存在的对象,这些对象当处于活跃状态的时候能够执行特定的操作。例如:一个准备(prepare)句柄在活跃的时候可以在每个循环中调用它的回调一次。一个TCP服务器的句柄在每次有新的连接的时候都会调用它的连接回调函数。 

        请求(request)一般代表短时操作。这些操作能用作用于句柄之上。写请求用于在句柄上写数据;还有一些例外,比如说getaddrinfo请求不需要句柄而是直接在循环中执行。

        I/O循环 

        I/O循环或者叫做事件循环是整个libuv的核心部分。I/O循环建立了所有IO操作的执行环境,I/O循环会被绑定在一个线程之上。我们可以运行多个时间循环,只要每一个都运行在不同的线程之上。libuv事件循环 不是 线程安全的,所以所有包含事件循环的API及句柄都不是线程安全的。 

        事件循环遵循最普遍的单线程异步I/O方法:所有I/O或者网络操作在非阻塞的socket上执行,这个socket会使用基于平台的组好的poll机制:在linux上使用epoll,在OSX和其他BSD平台上使用kqueue,在sunOS上使用event ports,在windows上使用IOCP。为循环迭代的一部分,循环会阻塞以等待socket上的I/O活动,这些活动已经被加到socket的触发实践中了,一旦这些条件满足,那么socket的状态就会发生变化,从而循环不再阻塞,而且句柄也可以读、写及执行其他期望的I/O操作。 

        为了更好的理解事件循环操作如何进行,一下的图展示了一个循环迭代的所有阶段。 

  1. 循坏中的“now”被更新为当前时间。事件循环在循环开始时缓存当前时间滴答数的目的是为了减少时间相关的系统调用数量。
  2. 如果循环是alive的,那么表明一个迭代已经开始了,否则的话循环会立即退出。那么,什么时候一个循环被认为是alive的呢?答案是如果一个循环中包括活跃及被引用的句柄(active and ref`d handles),活跃的请求或者是正在关闭的句柄,那么这个循环被认为是活的(alive)。
  3. Due定时器运行。
  4. 挂起的回调被调用。
  5. 空闲(idle)句柄回调被调用。
  6. 准备(prepare)回调句柄被调用。
  7. 计算poll超时。
  8. 循环阻塞。
  9. 调用check句柄。
  10. 调用close句柄。
  11. 特殊case运行。
  12. 一次循环迭代结束。

        libuv利用线程池技术使得异步文件I/O操作称为可能,但是对于网络IO只能执行在一个单一线程中,即loop的线程中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libhv和libuv都是开源的跨平台网络库,用于处理网络编程中的底层操作。它们的主要功能是封装对操作系统提供的异步IO接口,使开发者能更加方便地编写高性能的网络应用程序。 libhv是基于C语言的网络库,提供了一套简洁易用的API接口。它开发的初衷是为了满足高性能Web服务器的需求,因此在性能和效率方面有很好的表现。它支持多线程、异步IO、定时器、事件派发等功能,可以在处理大量并发连接的场景中保持低延迟和高吞吐量。libhv还能处理HTTP、WebSocket等应用层协议的解析和处理,使开发者能更加专注于业务逻辑的实现。 libuv也是跨平台的网络库,但是与libhv不同的是,libuv更加注重事件驱动的编程模型。它采用了事件循环机制,可以处理大量同时发生的事件,并将事件分发给相应的事件处理器进行处理。libuv的优点在于它的跨平台性和高性能,它的事件循环机制可以充分利用操作系统提供的异步IO接口,使得网络应用程序能在不同的操作系统上实现高度一致的性能。 在使用上,libhv和libuv都可以在不同的操作系统上运行,包括Windows、Linux、macOS等。它们都提供了丰富的API接口,使得开发者能够灵活地处理网络编程中的各种需求。同时,它们都有活跃的开发社区,可以获取到及时的技术支持和更新。 总体来说,libhv和libuv都是优秀的网络库,具有很高的性能和可靠性。它们的出现不仅使网络编程更加容易,也为开发高性能的网络应用提供了很好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值