关于node.js内部asynchronousI / O机制的困惑

  1. 我已经了解到,node.js在内部使用libeio在* nix平台上执行asynchronous文件 I / O和线程池,对吗?
  2. asynchronousnetworking I / O呢? 它是由libev完成的吗? 是否还有线程池?
  3. 如果里面有线程池,怎么比传统的单线程请求模式更有效率呢? 这是每个I / O请求一个线程?
  4. 而在Windows上的机制是什么? 我知道这是由IOCP完成的,并且有一个内核级线程池,对吧?
  5. 为什么Linux没有像Windows IOCP那样的本地完全AIO机制呢? 将来会有吗?

根据长常的回答更新:

  1. 我在@changchang给出的源代码中快速查看了一下,发现默认的线程池大小可以通过UV_THREADPOOL_SIZE来重置,我想知道在哪种情况下这个会被使用?
  2. 我也发现getaddrinfo使用这个线程池,除了fs还有吗? 如果所有的同步工作都将在这个线程池中完成,默认大小“4”是否足够?
  3. 正如我现在的理解,node.js过程中将有6个基本线程:1个V8线程(事件循环,其中用户JavaScript代码运行),1个libuv事件循环,以及线程池中的4个,对吗?
  4. 我怎么能看到我的shell(Ubuntu)这些线程? 我用ps -eLf | grep节点| grep -v grep只看到了两个:

    root 16148 7492 16148 0 2 20:43 pts / 26 00:00:00 ./bin/node/home/aaron/workspace/test.js
    root 16148 7492 16149 0 2 20:43 pts / 26 00:00:00 ./bin/node/home/aaron/workspace/test.js

  1. 首先, libuv已经把libeio了。 但正如你所提到的那样,它使用像libeio这样的线程池执行异步文件I / O。

  2. libuv也删除libev 。 它基于不同平台的异步I / O接口(如epollkqueueIOCP )进行异步网络I / O,无需线程池。 有一个事件循环在uv的主线程上运行,轮询I / O事件并处理它们。

  3. libuv里面的线程池是一个固定大小的线程池( 在系统 libuv是4 )。 它执行任务队列角色,并在请求增加时通过无限地生成线程来避免系统资源的耗尽。

Uptil版本0.6节点使用libev来运行异步I / O的事件循环和libeio (Unix后端严重依赖于这两个库)。 但是libuv已经开始在0.8版本中取代libevlibeio了。 它执行,维护和管理事件池中的所有io和事件。 libuv是跨平台异步IO库的选择。

  1. 是的,直到节点0.6,在0.8中弃用,并使用线程池
  2. 是的,但libev不使用线程池。 看到这里

    澄清:根据我发布的问题中的链接 , libeio确实支持处理I / O(包括套接字)的所有POSIX函数。 但是节点作者决定仅将它用于异步文件I / O,并使用libev作为网络I / O。 我不知道你从哪里听到它,但你可以在普通文件上使用epoll。

  3. libev使用事件循环,所以在这里没有问题。

  4. 是的IOCP在Windows中处理异步I / O,内核使用线程池。
  5. 新的linux内核在新的BSD内核中有epoll,kqueue。 libevlibeio是针对linux环境的,并为所有内核提供事件循环/异步IO(支持select,poll,epoll,kqueue)。

更新问题:

  1. libuv不太了解
  2. 也许够(不知道)
  3. 这里是我在Windows 8上的发现,通过Process Explorer进行检查。 针对节点应用程序进程显示4个线程,1个DLL,1个文件和1个部分(总共7个条目)。

  4. ps -eLf确实显示了所有线程和进程,也许你正在过滤它,只要找到节点进程pid就好像ps -eLf | grep x ps -eLf | grep x其中x是节点进程的pid。