当我们说Javascript引擎/ nodejs是单线程的时,这是否意味着它在处理器中使用了单个逻辑核心,仅此而已?

问题描述

我一直在学习JavaScript实现是单线程的,所以我想知道这是否意味着它占用了cpu的单个逻辑线程?还是软件线程与硬件线程完全不同?

解决方法

(这里是V8开发人员。)

JavaScript实现为单线程

那不是很正确。 JavaScript 作为一种语言是单线程的。程序员,这意味着它没有给您一种方式说“请在此处启动与我的其他代码并行运行此代码的新线程”。一次只能执行一个功能。只有当当前正在执行的函数返回时,新函数(例如调度的回调)才能开始执行。

(Web worker与此并不矛盾。它们确实与您的主代码并发执行,但这不是JavaScript语言功能。相反,浏览器环境为您提供了一种生成单线程的独立第二实例的方法。 JavaScript执行环境。)

JavaScript 实现(即引擎)可以随意使用任意多个线程来执行后台任务。例如,当您使用异步DOM功能(例如fetch API)时,通常,另一个线程负责在后台(通常在另一个CPU内核上)完成工作(在这种情况下,指提取)。结果可用后,将安排一个回调,该回调必须等待直到单个主线程可以自由执行它为止。特别是对于V8,我可以告诉您它还使用后台线程来解析和编译JavaScript代码以及垃圾回收。 (其他引擎也可能这样做,但我也不是很了解。)

软件线程与硬件线程完全不同吗?

好吧,软件线程是要运行的“线程” /链/执行序列,“硬件线程”是硬件执行它的能力。就我个人而言,我认为“硬件线程”是一个令人困惑的错误称呼,相反,将其称为“(逻辑)CPU内核”会更有意义。无论如何,它等于同一件事。

是的,单线程程序将在一个硬件线程上运行(或根本不运行)。 JavaScript 程序本身是单线程的(由语言定义),但是运行程序的 engines 通常使用多个线程(即,在多个“硬件”上运行的多个软件线程)线程” / CPU内核)。

,

在任何给定时间,一个软件线程最多只能在单个CPU内核中执行。我之所以包含“最多”,是因为软件线程可以处于非运行状态(而不是处于执行状态)(可能正在等待,睡眠,死机……)。

您不能保证软件线程始终在同一CPU内核上执行。尽管出于性能原因(主要与缓存相关),您的操作系统线程调度程序可能会尝试始终在同一内核上执行线程。

硬件线程(或逻辑内核,因为操作系统将其视为真实的硬件内核)是某些处理器的功能,这些处理器允许在某些情况下在同一内核上复用多个线程的执行。例如,如果您有两个寄存器,并且两个寄存器都使用内核的不同部分或在任何时刻等待(例如,一个在加数而另一个在执行逻辑运算),则可以在单个内核中执行两个线程。 / p>

总而言之,您的操作系统可能在大多数时间都在为JavaScript引擎使用相同的内核,但是您实际上不应该依赖此假设。