当我们说Javascript引擎/nodejs是单线程的时,这是否意味着它在处理器中只使用了一个逻辑核心,而没有其他功能



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

(此处为V8开发人员。(

JavaScript实现是单线程

这不太正确。JavaScript作为一种语言是单线程的。这意味着它没有给程序员一种说";请启动一个新的线程,在这里与我的其他代码并行运行此代码";。一次只能执行一个函数。只有当当前正在执行的函数返回时,新函数(例如,计划的回调(才能开始执行。

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

JavaScript实现,即引擎,可以自由地为后台任务使用任意数量的线程。例如,当您使用异步DOM功能(如fetchAPI(时,通常由另一个线程负责在后台(通常在另一个CPU内核上(执行工作(在本例中为获取(。一旦结果可用,就会调度回调,必须等到单个主线程空闲时才能执行。特别是对于V8,我可以告诉你,它还使用后台线程来解析和编译JavaScript代码,以及垃圾收集。(其他引擎可能也会这样做,但我不太了解它们。(

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

好吧,软件线程是一个;线程"/要运行的执行串/序列;硬件线程";是硬件执行它的能力;硬件线程";是一个令人困惑的误称,称之为";(逻辑(CPU核心";相反不管怎么说,这都是一回事。

因此,是的,一个单线程程序将在一个硬件线程上运行(或者根本不运行(。JavaScript程序本身是单线程的(这是由语言定义的(,但运行程序的引擎通常使用几个线程(即,在几个"硬件线程"/CPU内核上运行的几个软件线程(。

在任何给定时间,软件线程最多只能在单个CPU内核中执行。我已将";最多";因为一个软件线程可能处于一堆状态,而不是它没有运行的执行状态(它可能在等待、睡眠、死亡…(

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

硬件线程(或逻辑内核,因为操作系统将它们视为真正的硬件内核(是一些处理器的一个功能,允许在某些条件下多路复用同一内核上的多个线程的执行。例如,如果您有两倍的寄存器,并且两个寄存器都在使用核心的不同部分或在任何时刻等待(例如,一个在添加数字,另一个在进行逻辑运算(,那么您可以在单个核心中执行两个线程。

总之,您的操作系统可能在执行JavaScript引擎的大部分时间里都使用相同的核心,但您真的不应该依赖这种假设。

相关内容

最新更新