7

到目前为止我发现的“隔离”的解释。

经验 #1:http: //izs.me/v8-docs/classv8_1_1Isolate.html

“Isolate 表示 V8 引擎的一个隔离实例。V8 隔离具有完全独立的状态。来自一个隔离的对象不得在其他隔离中使用。当 V8 初始化时,会隐式创建并输入默认隔离。嵌入器可以创建其他隔离和在多个线程中并行使用它们。在任何给定时间最多可以有一个线程进入隔离。Locker/Unlocker API 可用于同步。”

经验 #2:https ://developers.google.com/v8/get_started

“隔离是一个拥有自己堆的虚拟机实例。”

好的我明白了。“隔离”是一个可以单独操作的隔离线程。以下是我的问题。

  1. 它看起来对我来说只是线程,除了它有自己的堆。有什么区别吗?

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

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

我的问题可以很容易地概括为“隔离”的作用是什么,怎么可能有自己的堆空间,为什么必须有自己的堆。

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

---- 把问题说清楚---- 我的问题的重点是问:是什么让google 在V8 中实现isolate?隔离的好处是什么?在 V8 中使用隔离的一个很好的例子是什么?他们(隔离)同时执行什么?

4

2 回答 2

8
  1. 它看起来对我来说只是线程,除了它有自己的堆。有什么区别吗?

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

  1. 我认为“隔离”可用于实现并发 GC。上面的定义说每个“隔离”不能用于其他“隔离”。但是并发 GC 应该检查(或标记)主(或其他)线程(或 Isolate)的活动对象。怎么可能?

Mark&Sweep GC中的非压缩扫描操作可以从另一个线程同时执行。其他 GC 操作,如压缩扫描、清除、标记只能在 JS 不在隔离中执行时执行。

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

好吧,您不知道地址,也不可能让它坚持 V8 API。即使您可以获取地址,该地址也不能安全使用,因为 V8 会不断地在其堆中移动内容。而且 malloc 不会返回指向某个隔离区的 js 堆的地址,因为显然该内存已被隔离区分配。

于 2015-03-27T13:43:22.367 回答
1

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

于 2015-03-27T11:49:05.107 回答