Pre*_*rem 8 javascript v8 node.js libuv
我正在学习Node.js的体系结构。我有以下问题。
V8项目和libuv项目是 NodeJS 的两个最重要的依赖项。
我认为在进入节点事件循环之前对线程有一个基本的了解非常重要。
因此,让我们将线程视为需要由 CPU 执行的指令的待办事项列表,CPU 将从上到下开始逐一运行这些线程。单个进程内部可以有多个线程。
要了解线程,了解调度的概念也很重要,因为您的 CPU 每秒只能处理这么多指令。
现在V8、libuv和事件循环之间有什么关系?
嗯,我建立的V8和libuv是 NodeJS 的依赖项,这使得在浏览器之外运行 JavaScript 成为可能。每当我们在计算机上启动 Node 程序时,Node 都会自动启动一个线程并在该线程内执行一些代码。在该单个线程内部有一个称为“事件循环”的东西,它可以被视为一种控制结构,它决定我们的一个线程在任何时间点应该做什么。
它是任何 Node 程序的绝对核心,每个 Node 程序都只有一个Event Loop。
所以:
事件循环是 libuv 或 v8 的一部分吗?
是的,事件循环来自 Node 启动的进程,该进程具有V8和libuv作为依赖项。
事件队列是事件循环的一部分吗?事件队列是由 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的四线程线程池的限制。所有工作都是由操作系统本身完成的,我们根本不接触线程池。
首先,事件循环是一个高级概念,它是JavaScript编程模型的基本组成部分。实际上,每个V8嵌入器都需要实现一个事件循环。V8提供了默认实现,嵌入程序可以替换或扩展。
我不明白这个问题。(我猜答案是“是”,但是“事件循环”和“事件队列”之间有什么区别?)
没有。(除了Node.js两者都使用。)
是的,事件循环是单线程的。
是的,浏览器也有一个事件循环(请参阅问题1)。
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |