V8中“隔离”的作用是什么?怎么可能孤立地制造“孤立”呢?

时间:2015-03-27 11:14:13

标签: javascript multithreading v8 javascript-engine

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

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实例。”

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

  1. 它看起来就像是我的线程,除了它有自己的堆。有什么不同吗?

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

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

  4. 我的问题可以很容易地归纳为“隔离”的作用是什么,以及如何拥有自己的堆空间以及它为什么必须拥有自己的堆。

    如果有人分享一些好的“隔离”文件,将会非常有帮助。 谢谢你的阅读。

    ----明确问题---- 我的问题的关键点是 问:谷歌在V8中实施隔离的原因是什么? 隔离的好处是什么?在V8中使用隔离的好例子是什么?它们(隔离物)同时执行的是什么?

2 个答案:

答案 0 :(得分:6)

  
      
  1. 它看起来像是我的线程,除了它有自己的堆。有什么不同吗?
  2.   

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

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

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

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

嗯,你不知道地址,也不可能让它坚持使用V8 API。即使你可以获得地址,地址也不安全使用,因为V8不断地在其堆中移动东西。并且malloc不会返回指向某些隔离的js堆的地址,因为显然内存已经被隔离区进行了malloced。

答案 1 :(得分:1)

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