一尘不染

关于node.js内部异步I / O机制的困惑

linux

  1. 我了解到,在 nix平台上,node.js内部使用libeio 通过线程池执行异步 文件* I / O,对吗?
  2. 异步 网络 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


阅读 197

收藏
2020-06-03

共1个答案

一尘不染

  1. 首先,libuv已将其删除libeio。但是它确实会像libeio您提到的那样使用线程池执行异步文件I / O。

  2. libuv也会删除libev。它的异步网络I / O基于异步I /在不同的平台,如O接口epollkqueue并且IOCP,没有一个线程池。在主线程上运行一个事件循环,该循环uv轮询I / O事件并对其进行处理。

  3. 内部的线程池libuv是一个固定大小的线程池(在uinx中为4,类似于system)。它执行任务队列角色,并在请求增加时无限期地生成线程,从而避免了系统资源的耗尽。

2020-06-03