首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在unix中,libuv是使用epoll还是select(2)

在Unix中,libuv使用了多种事件驱动的机制,包括epoll、kqueue、select等。具体使用哪种机制取决于操作系统的支持和可用性。

  1. epoll:epoll是Linux系统中的一种事件通知机制,通过在内核中注册事件和文件描述符,实现高效的事件驱动。libuv在支持epoll的Linux系统上会优先选择使用epoll作为事件驱动机制。
  2. kqueue:kqueue是BSD和Mac OS X系统中的一种事件通知机制,类似于epoll,也能实现高效的事件驱动。libuv在支持kqueue的系统上会选择使用kqueue作为事件驱动机制。
  3. select:select是Unix系统中最古老的一种事件通知机制,通过在一组文件描述符上进行轮询,实现事件驱动。libuv在不支持epoll和kqueue的系统上会选择使用select作为事件驱动机制。

总结起来,libuv会根据操作系统的支持情况选择合适的事件驱动机制,优先选择epoll和kqueue,如果不支持则使用select。libuv是一个跨平台的库,可以在不同的操作系统上使用相同的API进行开发。对于开发者来说,不需要关心具体使用了哪种事件驱动机制,只需要使用libuv提供的API进行开发即可。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

libuvcocos2d-x使用

不允许使用外置USB,想用吗?走个OA单申请一下,一般开发人员的申请直接被拒绝的,主程除外(好吧,我算比较幸运的 - “主程”) 吐槽归吐槽,活还是要干活的滴。...libuv实际使用我发现的几个问题,如果连接socket时后台主动断开连接,那么后台最后发送出来的消息有可能会接收不到(概率性的,解决方法就是让后台发送消息完之后延时几秒再关闭socket连接)。...而libuv因为本身用纯C实现的,它的回调方法基本上都是static函数,用C++封装的话有点小麻烦,网上也有人用C++11封装的比较好,可惜我使用的NDK版本比较低,支持不了C++11的特性只好放弃...4、开启消息循环,uv_run 通常使用时,我们都需要新启动一个线程,该线程来执行uv_run来保证不阻塞当前调用的线程(uv_run阻塞的,不会立即返回)。...使用线程的关键函数:uv_thread_create(创建线程)、uv_async_init、uv_async_send(线程通信),消息的发送异步的,另外一个线程多次(二次或更多)调用了uv_async_send

1.6K30
  • 核心库Libuv入门(Hello World篇)

    Libuv历史 Nodejs刚出来的时候,底层并不是使用libuv,而是libev,libev本身也是一个异步IO的库,但是它只能在POSIX[2]系统下使用。...这时候Nodejs提供了libuv来作为抽象封装层,Unix系统上,通过封装libev和libio调用linux的epoll 或 kqueue,Windows 平台上的IOCP[3]进行封装,自此之后...Nodejs具备了跨平台能力,由Libuv作为中间层本身提供的跨平台的抽象,来根据系统决定使用libev/libio或IOCP,后来node-v0.9.0版本libuv移除了libev的内容。...TTY•PC包括套接字共享,使用Unix域套接字或有名管道(Windows)•子进程•线程池•信号处理•高分辨率时钟•线程和同步原语 Libuv入门实战之Hello world 笔者MacOS的系统,...[2] 一套操作系统 API 规范。

    3K20

    分享 10 道 Nodejs EventLoop 和事件相关面试题

    描述下 Linux/Unix 的几种 I/O 模型? I/O 多路复用模式下 selectepoll 的区别? setTimeout/setInterval 定时器时间是否精确?...Q1:Node.js 定时功能的顺序怎样的? Node.js 的定时器模块提供了一段时间之后执行一些函数的功能。...操作方式上 select 采用了线性遍历来查找,链接多了之后可以想象一下一个诺大的数组每次通过遍历来锁定一个链接,多么的消耗性能。...从操作系统支持上来看,目前流行的高性能 Web 服务器 Nginx 基于 epoll 来实现高并发,当然如果你的链接很小的情况下区别还是不大的 select 也能满足,如果大流量、高并发情况 epoll...目前还是首选模型。

    1.4K50

    为什么要读nodejs源码?

    js层最后还是依赖底层,但是js层也有很多逻辑,看懂了js层,使用nodejs的时候,也就能更加深刻地了解到你在做什么,nodejs在做什么。...但是js层远远不够的。因为他只是个壳子。 那么接下来,你就要去读c++层,读c++层的代码,更多的了解如何去使用v8。...从libuv官网我们也可以知道,libuv包括了进程、线程、定时器、文件、tcp、udp、unix域、线程池、dns等等能力,使用到操作系统能力包括进程间通信(管道、unix域、eventfd)、线程池...、事件驱动(epollselect、poll、kqueue等)、inotify机制、文件操作等等,使用数据结构和算法有二叉堆、红黑树、队列等。...对个人而言,我是非常感谢nodejs,也非常敬佩nodejs作者和贡献者,但是我觉得我阅读nodejs源码,更多的了解了nodejs的原理,并没有学到太多我想学的东西,v8算一方面,而libuv的内容

    50030

    Node.js的底层原理

    Node.js选取的进程间通信方式Unix域,Node.js为什么会选取Unix域呢?因为只有Unix域支持文件描述符传递。文件描述符传递一个非常重要的能力。...上图操作系统中信号的表示,操作系统使用一个long类型表示进程收到的信息,并且用一个数组来标记对应的处理函数。 我们看一下信号Libuv如何实现的。 ?...1 Libuv维护了一个红黑树,当我们监听一个新的信号时就会新插入一个节点 2 插入第一个节点时,Libuv会封装一个io观察者注册到epoll,用来监听是否有信号需要处理 3 当信号发生的时候...3 当文件发生改变的时候,我们可以调用read接口获取哪些文件发生了改变,inotify通常结合epoll使用。 接下来我们看看Node.js如何基于inotify机制 实现文件监听的。 ?...UDP 因为udp是非连接、不可靠的协议,实现和使用上相对比较简单,这里讲一下发送udp数据的过程,当我们发送一个udp数据包的时候,Libuv会把数据先插入等待发送队列,接着epoll中注册等待可写事件

    2K20

    干货!!字节大佬带你深入分析Node.js的底层原理

    第三方库:异步 DNS 解析( cares )、HTTP 解析器(旧版使用 http_parser,新版使用 llhttp)、HTTP2 解析器( nghttp2 )、 解压压缩库( zlib )、加密解密库...2. Node.js代码架构 上图 Node.js 的代码架构,Node.js的代码主要分为 JS、C++、C 三种: JS 我们平时使用的那些模块(http/fs)。...信号 上图操作系统中信号的表示,操作系统使用一个 long 类型表示进程收到的信息,并且用一个数组来标记对应的处理函数。我们看一下信号模块 Libuv 如何实现的。...Libuv 维护了一个红黑树,当我们监听一个新的信号时就会新插入一个节点 插入第一个节点时,Libuv 会封装一个 IO 观察者注册到 epoll ,用来监听是否有信号需要处理 当信号发生的时候,...UDP 因为 UDP 是非连接、不可靠的协议,实现和使用上相对比较简单,这里讲一下发送 UDP 数据的过程,当我们发送一个 UDP 数据包的时候,Libuv 会把数据先插入等待发送队列,接着 epoll

    2.3K30

    深入浅出 Nodejs(四):Nodejs 异步 IO 机制

    它是read的基础上改进的一种方案,通过对文件描述符上的事件状态进行判断。图2通过select进行轮询的示意图。...select轮询具有一个较弱的限制,那就是由于它采用一个1024长度的数组来存储状态,也就是说它最多可以同时检查1024个文件描述符。 图2 通过select进行轮询的示意图 poll。...,选择性编译unix目录或是win目录下的源文件到目标程序,其架构如图7所示。...Node,无论*nix还是windows平台,内部完成I/O任务的另有线程池。 1.4 Node的异步I/O 介绍完系统对异步I/O的支持后,我们将继续介绍Node如何实现异步I/O的。...这里libuv作为封装层,有两个平台的实现,实质上调用了uv_fs_open()方法。uv_fs_open()的调用过程,我们创建了一个FSReqWrap请求对象。

    2.3K00

    理解Linux里面的IO模型

    Linux里面这么设计的目的主要是为了安全,即使用户空间崩溃了,内核也不受影响。...同步阻塞IO 同步阻塞 IO 模型最常用的一个模型,也是最简单的模型。linux,默认情况下所有的socket都是blocking。它符合人们最常见的思考逻辑。...UNIX/Linux 下的 select、poll、epoll 就是干这个的(epoll 比 poll、select 效率高,做的事情一样的) ? 。...当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket的数据准备好了,select就会返回。...多路复用的特点通过一种机制一个进程能同时等待IO文件描述符,内核监视这些文件描述符(套接字描述符),其中的任意一个进入读就绪状态,select, poll,epoll函数就可以返回 信号驱动IO 信号驱动式

    2.1K30

    说说Nodejs高并发的原理

    ,我们可以以异步的方式去进行I/O操作,通过API调用I/O操作后会马上返回,紧接着就可以继续执行其他代码逻辑,那为什么nodejs的I/O“非阻塞”的呢?...libuv实际上一个跨平台的c语言库,它在windows、linux等不同平台下会调用不同的实现。...我这里主要分析linux下libuv的实现,因为我们的应用大部分时候还是运行在linux环境下的,且平台间的差异性并不会影响我们对nodejs原理的分析和理解。...好了,对于nodejslinux下的I/O模型来说,libuv实际上提供了两种不同场景下的不同实现,处理网络I/O主要由epoll函数实现(其实就是I/O多路复用,在前面的图中使用select函数来实现...I/O多路复用,而epoll可以理解为select函数的升级版,这个暂时不做具体分析),而处理文件I/O则由多线程(线程池) + 阻塞I/O模拟异步I/O实现---下面一段我写的nodejs底层实现的伪代码帮助大家理解

    2.3K30

    说说Nodejs高并发的原理

    ,我们可以以异步的方式去进行I/O操作,通过API调用I/O操作后会马上返回,紧接着就可以继续执行其他代码逻辑,那为什么nodejs的I/O“非阻塞”的呢?...libuv实际上一个跨平台的c语言库,它在windows、linux等不同平台下会调用不同的实现。...我这里主要分析linux下libuv的实现,因为我们的应用大部分时候还是运行在linux环境下的,且平台间的差异性并不会影响我们对nodejs原理的分析和理解。...好了,对于nodejslinux下的I/O模型来说,libuv实际上提供了两种不同场景下的不同实现,处理网络I/O主要由epoll函数实现(其实就是I/O多路复用,在前面的图中使用select函数来实现...I/O多路复用,而epoll可以理解为select函数的升级版,这个暂时不做具体分析),而处理文件I/O则由多线程(线程池) + 阻塞I/O模拟异步I/O实现---下面一段我写的nodejs底层实现的伪代码帮助大家理解

    1.1K00

    详解 Java 4 种 IO 模型

    程序设计,一些涉及底层的程序编写往往会围绕着文件描述符展开。文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。...多路复用的特点通过一种机制一个进程能同时等待IO文件描述符,内核监视这些文件描述符(套接字描述符), 其中的任意一个进入读就绪状态,select, poll,epoll函数就可以返回。...对于监视的方式, 又可以分为 select, poll, epoll三种方式。...所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用多线程 + 阻塞IO的web server性能更好,可能延迟还更大。...也就是说,select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

    64520

    Node.js 的底层原理

    2. Libuv 一个跨平台的异步 IO 库。它主要的功能它封装了各个操作系统的一些 API, 提供网络还有文件进程的这些功能。...JS 代码就是我们平时使用的那些 JS 的模块,比方说像 http 和 fs 这些模块。 2....2 Node.js Libuv 首先来看一下 Node.js Libuv,下面从三个方面介绍 Libuv。 1. 介绍 Libuv 的模型和限制 2....下面以 Linux 的 事件驱动模块 epoll 为例,来看一下使用流程。 1. 首先通过 epoll_create 去创建一个epoll 实例。 2....可以看到,Node.js 虽然多线程上面的,但是所有的 JS 代码都是跑单个线程里的,这也是我们经常讨论的 Node.js 单线程还是多线程的,从不同的角度去看就会得到不同的答案。

    1K40

    你可以这么理解五种IO模型

    举个例子,也就是说进程可以通知内核socketfd集合{1,2,3}进行侦听,知道socketfd集合任何一个可读的话,就返回。这个等待的过程阻塞的,它可以侦听多个,但是侦听的数量有限的。...epollLinux下多路复用IO接口select/poll的增强版本,它能显著提高程序大量连接只有少量活跃的情况下的系统CPU利用率. epollselect/poll的对比 一个进程能够打开...总结: 进程通过调用内核select/poll/epoll,监听socketfd集合的读写就绪状态,多个socketfd都能在一个线程交替完成,所谓的复用就是指使用的同一个线程。...实际工程项目中,普遍使用I/O复用模型,本章重点介绍了I/O复用模型,Java的NIO也是基于此。学习I/O模型有助于更好的理解NIO,学习Netty框架。...勿浮沙筑高楼 参考: epoll百度百科 《UNIX网络编程》 《Netty权威指南》 聊聊五种I/O模型

    60350

    谈谈网络通信服务器的结构应该如何设计

    但我总感觉这个优势有点站不住脚(单 epoll + 线程池模型),主要考虑到两点: 线程池的实现机制使得需要引入锁管理线程调度,这个开销 per thread per epoll 模型不需要的。...大量的短连接导致需要经常对 epoll 进行添加和删除操作,线程池进行这个任务需要对唯一的 epoll 加锁的(可能有方法不需要加,我还不知道),而 per thread per epoll 没有这个问题...我们来详细讨论一下:不管 per thread per epoll 还是一个 epoll + 线程池,应该抓住关键点。...m_bQuit) { //步骤一:使用select或者epoll_wait等IO复用技术检测socket上是否有读写或出错事件 // 对于第一个循环,只检测侦听socket是否有事件...没关系,我们可以使用一些"技术"立即唤醒他们,比如给 epoll 或者 select 额外绑定一些“功能” socket,Linux 还可以绑定 eventfd 或者 socketpair。

    1.2K20

    深入 Node.js 事件循环架构

    如果我们 2 核处理器执行其同步版本并进行 4 次调用,假设一次调用的执行时间 2 ms ,则总耗时为 4 * 2 ms = 8 ms 。...但是如果在同一个 CPU(2核)执行这个方法的异步版本,总耗时则为 2 * 2 ms = 4 ms ,因为处理器将使用默认 4 个线程(下文将会说明),将它托管到两个进程并执行。...所以,Node.js 多线程的吗? 当然,Node.js 使用了多线程。 然而,Node.js 到底单线程还是多线程,这取决于 when ? 02 — 我们来看看 TCP 连接。...所以有一种更好的方法:使用 Epollunix系统)或着 Kqueue(BSD系统,其实跟 Epoll 同一个东西,不同系统名称不一样而已)。 Epoll unix 系统相关底层知识。...Pipe 管道连接两端:一端线程,当它完成时,往管道写入数据,另一端 Epoll 循环中等待,当它获取到数据时,Epoll 循环唤醒。因此 pipe Epoll 响应的。

    1.7K20

    聊聊 Libuv 最近引入的 io_uring

    因为 epoll 不支持普通文件的 Poll 能力,所以 Libuv ,异步文件 IO 操作需要通过线程池来实现,具体来说就是当用户发起一个异步文件 IO 操作时,Libuv 会把这个操作放到线程池中... Libuv 早期的实现,如果执行比较慢的任务过多就会把线程池中的线程消耗完,从而导致执行比较快的 IO 操作需要等待很长时间,一个例子就是 DNS 解析会阻塞文件 IO 任务。...原生 io_uring 的使用比较复杂,通常需要借助 liburing 库,但是 Libuv 可能为了减少对第三方库的依赖,实现上使用原生的方式。...因为 Libuv 使用了 UVIORING_SETUP_SQPOLL 模式,所以还需要判断这时候内核轮训线程是否处于睡眠状态,这就是 uv__iou_submit 的逻辑。...现代软件中大多数使用的 IO 模型 epoll,随着 io_uring 的发展和成熟,io_uring 将会出现在更多的软件,之前我也体验了一下 io_uring,有兴趣的可以体验下 https:/

    37220

    IO的内核原理与5种IO模型

    什么I/O 我们都知道unix世界里、一切皆文件、而文件是什么呢?...select/poll顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。Linux还提供了一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。...select、pselect、poll、epollLinux网络编程过程,很长一段时间都使用select做轮询和网络事件通知,然而select的一些固有缺陷导致了它的应用受到了很大的限制,最终Linux...使用mmap加速内核与用户空间的消息传递 无论select、poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存复制就显得非常重要,epoll通过内核和用户空间mmap同一块内存来实现的...程序设计,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

    1.9K53

    nodejs如何处理tcp连接的

    poll io阶段,我们的监听型的文件描述符和上下文(感兴趣的事件、回调等)就会注册到epoll。正常来说就阻塞在epoll。那么这时候有一个tcp连接到来,会怎样呢?...connection_cb里已经消费了accepted_fd, 否则先注销服务器epoll的fd的读事件,等待消费后再注册,即不再处理请求了 */ if (stream...接下来,我们重点看看回调里如何消费fd的,大量的循环会不会消耗过多时间导致Libuv的事件循环被阻塞一会。tcp的回调c++层的OnConnection。...WrapType* wrap; // 把js层使用的对象client_obj所对应的c++层对象存到wrap ASSIGN_OR_RETURN_UNWRAP(&wrap, client_obj...对于上层来说,就是拿到了一个和客户端的对象,Libuv结构体,c++层一个c++对象,js层一个js对象,他们三个一层层封装且关联起来的,最核心的Libuv的client结构体的fd

    93410

    高效IO之零拷贝技术

    无论 文件IO ,还是 网络IO ,最后都可以统一为用户空间和内核空间数据的交换。计算机内存和 CPU 都是非常稀有的资源,应该尽可能提高这些资源的使用效率。...常见IO模型 常见 IO模型 也就是同步和异步的 同步IO模型 阻塞 BIO 非阻塞 NIO IO多路复用:poll、epollselect 信号驱动IO 异步IO模型 Linux AIO 这里说明一下...:IO模型 虽然有些号称是不阻塞的,那是指在等待数据就绪的过程不阻塞的,但是接收数据的时候,依然还是阻塞的。... Linux 中提供了 AIO 的实现,但是实际上使用的并不多,更多还是使用独立的异步 IO 库,比如 libevent 、 libev 、 libuv 。 一般文件操作咋样?...而基于 NIO transferTo 的实现方式, Linux 和 Unix 上,则会使用到零拷贝技术,数据传输并不需要用户态参与,省去了上下文切换的开销和不必要的内存拷贝,进而可能提高应用拷贝性能。

    77810
    领券