【问题标题】:Why are modern browser JS engines multi-threaded? [closed]为什么现代浏览器 JS 引擎是多线程的? [关闭]
【发布时间】:2016-12-18 23:15:35
【问题描述】:

我了解现代浏览器的 JS 引擎(如 V8、Spidermonkey、Chakra 等)在内部使用线程池,即使只有一个线程(运行事件循环)暴露给 JS 程序员。

显然,(很少使用)Web Worker 需要多个线程(或多个进程)——否则它们无法利用多个 CPU 内核。我的问题是,除了 Web Workers,用多线程实现 JS 引擎有什么好处?

为什么 JS 引擎不能通过内部依赖 JS 程序员使用的同一个事件循环来保持单线程,在需要执行任何 IO 时使用非阻塞 OS 调用?

澄清一下:即使用户只用一个选项卡打开一个窗口,JS 引擎也会使用线程池。

编辑:这是回答here

【问题讨论】:

  • 一个浏览器同时查看多个网页?
  • @EdHeal 我编辑了我的问题以澄清。
  • @max 即使只有一个tab,浏览器UI也可能在另一个进程中使用JS。
  • @Oriol “在另一个进程中使用 JS”是什么意思?我问的是 JS 引擎本身,它不是用 JavaScript 编写的。浏览器执行的唯一 JS 代码是 HTML 页面内联或加载的脚本。所有代码都在单个线程中运行,但对并行执行的特殊支持除外,例如 Web Worker。
  • 一个可能的用例是在不同的线程上运行 GC

标签: javascript asynchronous internals


【解决方案1】:

脚本引擎的许多部分都受益于并行化,因为它们可以针对脚本的不同部分或相互关联地同时运行:

  • 正在解析
  • 编译
  • JIT,优化
  • 调试/记录/分析
  • 垃圾回收
  • 图形

这甚至不涉及在不同使用环境(工作脚本、浏览上下文)的多个引擎实例之间共享。

【讨论】:

  • IO 是完全单线程的,还是也受益于多线程?
  • 这在很大程度上取决于特定类型的 IO,并不一定对应于 js 引擎本身的好处。网络通常使用非阻塞操作系统调用来完成,而并行文件 IO 通常需要线程。然后与浏览器的其他组件(例如 DOM 或渲染管道)进行通信,这些组件也在多线程设计中实现。
猜你喜欢
  • 2021-03-24
  • 2020-10-30
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2015-08-09
  • 2011-04-16
相关资源
最近更新 更多