2013-10-15 35 views
24

这些对象在V8中有什么区别/连接?上下文是否属于隔离区,反之亦然?我知道一次只能由一个线程访问一个单独的隔离区(这就是我猜的v8 :: Locker)。v8 :: Isolate和v8 :: Context的区别究竟是什么?

我查看了文档,但我似乎无法掌握这些概念 - 任何帮助表示赞赏!

回答

26

我确信以下是简化,但它适用于我。

一种隔离是V8运行时的一个独立的副本,包括一个堆管理器,垃圾收集器等只有一个线程可以每次访问一个给定的分离物,但不同的线程可以访问不同的分离物同时进行。

然而,隔离不足以运行脚本。您还需要一个全局(根)对象。 A 上下文通过将隔离区堆中的对象指定为全局对象来定义完整的脚本执行环境。

因此,不仅可以在给定的隔离中存在许多上下文,而且它们还可以轻松安全地共享任何或所有对象。这是因为他们的对象实际上属于隔离区,并受隔离区独占锁的保护。

26

Isolates,顾名思义,是完全封闭的外部世界,所以Isolates可以并行运行,因为它们完全是V8的不同实例。将Isolate想象成一个沙箱 - 一个V8运行时环境。

现在在Isolate之内,您可能会有许多不相关的JavaScript应用程序同时运行。 JavaScript提供了很多全球级的语言工具,并且有多个不相关的应用程序与这些“单身人士”混在一起并不是一个好主意。因此,在V8的一个实例中称为Isolate,您可以定义多个Contexts,以便不相关的应用程序可以在不干扰彼此的情况下做他们需要做的事情。

这不是一个完美的类比,但是如果您了解Java Web的东西,可以想象Tomcat的多个实例部署在同一台机器上,然后Tomcat的每个实例都使用自己的Web上下文和web.xml运行单独的应用程序。这就是这样的。

希望有所帮助。

+0

菌株共享相同的平台信息,因此它们不是完全隔离的。他们并没有完全不同 – xaxxon