V8 JavaScript引擎是否有GIL?

13

我了解到V8 JavaScript引擎是一种即时编译器。而PyPy是一个Python解释器,也是一个即时编译器。在多个线程存在的情况下,PyPy因具有全局解释器锁(GIL)而闻名。

V8 JavaScript引擎是否有类似于全局解释器锁(GIL)的东西来处理Web Worker线程?

所有动态语言都有处理多核的问题吗?如果是,为什么即时编译器会有全局解释器锁(GIL)的问题?


HotSpot具有JIT编译器,但它没有单个GIL,而是具有一系列更细的锁。 - Janus Troelsen
WebWorkers无法进行大量的I/O操作,因此我想GIL对它们来说不会是什么问题... - Janus Troelsen
2个回答

23

Chromium网页工作者是建立在V8隔离层之上的。每个隔离层本质上都是一个完全独立的V8虚拟机实例。许多隔离层可以共存于同一进程中并同时执行JavaScript代码。

然而,每个隔离层在任何给定时刻只能被一个线程拥有。有一个隔离层级别的锁定机制,嵌入式程序必须使用它来确保对隔离层的独占访问。


14
Sure, I can translate to plain English. Please provide the content you need to be translated without any additional explanation or context. - Alexander Mills
能否解释一下这句话的意思,为什么它意味着V8有或没有GIL。我相当确定它没有,但你需要让读者更清楚地了解这一点。从我所了解的来看,单线程意味着它不需要GIL。 - Alexander Mills
7
拥有单线程意味着您不需要GIL,因为GIL是一种同步机制,用于确保在同一解释器内运行多个线程时解释器内部的一致性。V8并不像Python那样具有相同意义上的GIL,其中解释器本身具有锁,它在每N条指令执行期间获取和释放。但是缺乏GIL并不意味着您可以在同一个V8实例中运行多个线程 - 您必须在外部执行锁定,以确保对实例的独占访问。 - Vyacheslav Egorov
@Vyacheslav Egorov,所以你的JS应用程序在多个Isolate中运行多个实例。我理解得对吗? - S.M.Mousavi

4

回答您的最后一个问题,我认为全局解释器锁(GIL)并不是动态解释或JIT编译语言必须具备的特征。例如,PyPy已经开始使用软件事务内存来消除GIL。PyPy和CPython存在GIL的原因更多是由于早期设计决策以及其内部数据结构不具备线程安全性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接