"Isolate"在V8中的作用是什么?如何使"Isolate"独立起来?

8
我找到的“Isolate”的解释如下:
exp #1: http://izs.me/v8-docs/classv8_1_1Isolate.html “Isolate代表V8引擎的一个独立实例。V8隔离具有完全分离的状态。一个隔离中的对象不能在其他隔离中使用。当初始化V8时,会隐式地创建并进入默认隔离。嵌入程序可以创建额外的隔离,并在多个线程中并行使用它们。一个隔离每次只能被一个线程进入。Locker / Unlocker API可用于同步。”
exp #2: https://developers.google.com/v8/get_started “隔离是具有自己堆的VM实例。”
好的,我明白了。“Isolate”是一个可以单独运行的隔离线程。以下是我的问题。
  1. 对我来说,它看起来只是一个线程,但它有自己的堆。有什么区别吗?

  2. 我认为“Isolate”可以用于实现并发GC。上面的定义说每个“Isolate”不能在其他“Isolate”中使用。但并发GC应该检查(或标记)主线程(或其他线程或Isolate)的活动对象。这可能吗?

  3. 如何保护他们自己的对象?“Isolate”是一个线程而不是一个进程。因此,如果其他线程知道地址,它可以访问该线程的对象。如何保护呢?我无法理解拥有自己堆的含义。因为如果其他线程知道地址,它也可以访问。普通线程可以在内存空间中拥有它们的堆。由于堆的地址空间没有完全分离,但如果一个线程malloc一个内存,除非其他人知道地址,否则其他线程如何使用它?每个线程只malloc自己的堆空间和“Isolate”有自己的堆空间有什么区别?

我的问题可以轻松地总结为“Isolate”的作用是什么,如何拥有自己的堆空间以及为什么它必须拥有自己的堆。

如果有人分享一些关于“Isolate”的好文档,那将非常有帮助。谢谢阅读。

---- 清晰地表达问题 ---- 我的问题的关键点是: Q: 什么促使谷歌在V8中实现了隔离? 隔离的好处是什么?在V8中使用隔离的一个很好的例子是什么?它们(隔离)正在并发执行什么?

2个回答

10
  1. 对于我来说,它只是一个线程,除了它有自己的堆栈。有什么区别吗?

它们是正交的,一个线程可以同时执行多个隔离区,而一个隔离区一次只能由一个线程执行。当然,一个隔离区在不同的时间可能会被不同的线程执行,但这可能并不常见。一个隔离区只是 JavaScript VM 的一个实例,它只有自己的 JavaScript 堆栈,普通进程堆栈仍像平常一样在进程中共享。

  1. 我认为“隔离区”可以用于实现并发 GC。上面的定义说每个“隔离区”不能在其他“隔离区”中使用。但并发GC应该检查(或标记)主线程(或其他线程/隔离区)的活动对象。这如何可能?

标记清除 GC中进行非压缩扫描操作可由另一个线程并发地执行。其他GC操作,如压缩扫描、扫描和标记操作,只能在JS不在隔离区执行时执行。

  1. 如何保护自己的对象?“隔离区”是一个线程而不是一个进程。因此,如果其他线程知道地址,那么其他线程可以访问该线程的对象。这怎么可能?我也无法理解拥有自己的堆栈的意义。因为如果另一个线程知道地址,它也可以访问它。并且普通线程可以在内存空间中拥有自己的堆栈。由于堆栈的地址空间没有完全分离,所以如果一个线程分配了一块内存,除非其他人知道地址,否则其他线程无法使用它。每个线程分配自己的堆栈空间和“隔离区”有什么区别?

每个隔离区都有自己的 JavaScript 堆栈,因此只有在该隔离区的上下文中才能访问它。其他线程无法直接访问该隔离区的堆栈,必须通过消息传递等机制来进行通信。相比之下,普通线程共享同一进程的堆栈和堆空间。

你并不知道地址,且无法通过 V8 API 获取。即使你能够获取地址,由于 V8 不断地移动其堆中的内容,该地址也不安全可用。而 malloc 函数也不会返回指向某个隔离区 JavaScript 堆的地址,因为这段内存显然是被该隔离区申请的。


@Joffrey,任何线程都可以访问隔离区,就像我说的那样,但是我也说过,你只能同时执行非压缩扫描。因此,没有并发标记-在对其堆执行标记时,没有线程可以在隔离区中运行js。我在我的答案编辑中澄清了这一点。 - Esailija
谢谢您的回答。也许...我的问题没有表达清楚。问题2是在问并发GC如何标记和清理其他隔离堆?因为每个隔离体都无法看到其他隔离体的堆。我认为并发GC是隔离体的一个实例。如果是这样,那就与隔离体的解释相矛盾了。 - Joffrey
@Joffrey GC是V8的内部组件,它可以看到所有内容。 - Esailija
你说得对。如果答案不是我想要的,我应该编辑这个问题。尽管如此,由于这个问题没有清楚地陈述问题,我复制了类似的问题。谢谢你的建议。我是真心的,我会编辑这个问题。 - Joffrey

1

隔离:我们可以使用单个V8实例独立运行多个JavaScript函数。


3
这个回答中的引用和链接已经在问题中提到(逐字逐句)。您能否编辑您的回答并添加更多(新的)信息? - Rob W

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