事件循环,libuv和v8引擎之间的关系

Pre*_*rem 8 javascript v8 node.js libuv

我正在学习Node.js的体系结构。我有以下问题。

  1. 事件循环是libuv还是v8的一部分?
  2. 事件队列是事件循环的一部分吗?是由libuv或v8引擎或事件循环本身生成的事件队列?
  3. libuv和v8引擎之间有什么联系?
  4. 如果事件循环是单线程的,libuv是否会出现在视图中以创建多个线程来处理文件I / O?
  5. 浏览器是否具有事件循环机制或仅Node.js具有?

Dan*_*iel 9

V8项目和libuv项目是 NodeJS 的两个最重要的依赖项。

我认为在进入节点事件循环之前对线程有一个基本的了解非常重要。

因此,让我们将线程视为需要由 CPU 执行的指令的待办事项列表,CPU 将从上到下开始逐一运行这些线程。单个进程内部可以有多个线程。

要了解线程,了解调度的概念也很重要,因为您的 CPU 每秒只能处理这么多指令。

现在V8libuv事件循环之间有什么关系?

嗯,我建立的V8libuv是 NodeJS 的依赖项,这使得在浏览器之外运行 JavaScript 成为可能。每当我们在计算机上启动 Node 程序时,Node 都会自动启动一个线程并在该线程内执行一些代码。在该单个线程内部有一个称为“事件循环”的东西,它可以被视为一种控制结构,它决定我们的一个线程在任何时间点应该做什么。

它是任何 Node 程序的绝对核心,每个 Node 程序都只有一个Event Loop

所以:

事件循环是 libuv 或 v8 的一部分吗?

是的,事件循环来自 Node 启动的进程,该进程具有V8libuv作为依赖项。

事件队列是事件循环的一部分吗?事件队列是由 libuv 或 v8 引擎还是事件循环本身生成的?

事件队列,如果我理解的话,问题更多地归咎于您的操作系统调度程序。它决定哪些是最紧急的任务并首先运行这些任务。

libuv 和 v8 引擎有什么联系?

嗯,它们都是 NodeJS 的依赖项,并且都是用 C++ 编写的,V8是 70% C++,libuv是 100% C++。

如果事件循环是单线程的,libuv 是否会创建多个线程来处理文件 I/O?

所以这可能会令人困惑,节点事件循环是单线程的,但一些节点标准库模块和一些框架不是单线程的。

libuv库为 Node 提供了对操作系统的底层访问。libuv模块和 C++ 端使用线程池。它可用于运行计算量大的任务。

默认情况下,libuv在线程池中创建四个线程。除了事件循环中使用的线程之外,还有其他四个线程可用于卸载需要在应用程序内部进行的昂贵计算。

节点标准库中的许多函数都使用此线程池。所以是的,libuv参与创建一个由四个线程组成的线程池。因此libuv提供了一个线程池,用于卸载在非常昂贵的函数调用上完成的工作。

浏览器有事件循环机制还是只有 Node.js 有?

我只知道 NodeJS 内部有一个事件循环机制。

总而言之,我们拥有一款 2015 款双核 MacBook Pro。想象一下,您运行两个计算量大的函数,第一个函数在线程池内的一号线程上运行,它通过操作系统调度程序到达一号 CPU 核心。然后,第二个函数被分配给池中的第二个线程,并被分配给第二个 CPU 核心。所以线程池发生在libuv内部。

重要的一点是,如果您发出http请求,libuv会看到这一点,并且libuv和 Node 都没有任何代码来处理与网络请求相关的所有超低级操作。相反,libuv将请求委托http给底层操作系统。

在这种情况下,libuv用于向操作系统发出请求,并等待操作系统发出针对该请求返回的响应。因为libuv将其委托给您的操作系统,所以您的操作系统决定是否添加新线程。在这种情况下,http我们不受libuv的四线程线程池的限制。所有工作都是由操作系统本身完成的,我们根本不接触线程池。


jmr*_*mrk 8

  1. 首先,事件循环是一个高级概念,它是JavaScript编程模型的基本组成部分。实际上,每个V8嵌入器都需要实现一个事件循环。V8提供了默认实现,嵌入程序可以替换或扩展。

  2. 我不明白这个问题。(我猜答案是“是”,但是“事件循环”和“事件队列”之间有什么区别?)

  3. 没有。(除了Node.js两者都使用。)

  4. 是的,事件循环是单线程的。

  5. 是的,浏览器也有一个事件循环(请参阅问题1)。