Jof*_*rey 5 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实例."
好的我明白了."隔离"是一个可以单独操作的隔离线程.以下是我的问题.
它看起来像是我的线程,除了它有自己的堆.有什么不同吗?
我认为"Isolate"可用于实现并发GC.上面的定义说每个"隔离"不能用于其他"隔离".但并发GC应检查(或标记)主(或其他)线程(或隔离)的活动对象.怎么可能?
如何才能保护自己的物品?"隔离"是一个线程而不是一个过程.因此,如果其他线程知道地址,则可以访问该线程的对象.怎么可以保护它?我无法理解自己堆的含义.因为如果其他线程知道地址,它可以被其他线程访问.普通线程可以将它们的堆放在内存空间中.由于堆的地址空间没有完全分离,但如果一个线程malloc一个内存,除非其他人知道地址,否则其他线程如何使用它呢?每个线程只是malloc自己的堆空间和"Isolate"有自己的堆空间有什么区别?
我的问题可以很容易地归纳为"隔离"的作用是什么,以及如何拥有自己的堆空间以及它为什么必须拥有自己的堆.
如果有人分享一些好的"隔离"文件,将会非常有帮助.谢谢阅读.
----让问题清楚----我的问题的关键点是:问:谷歌在V8中实现隔离的原因是什么?隔离的好处是什么?在V8中使用隔离的好例子是什么?它们(隔离物)同时执行的是什么?
- 它看起来像是我的线程,除了它有自己的堆.有什么不同吗?
它们是正交的,一个线程可以一次执行多个隔离,而隔离只能一次由一个线程执行.当然,一个隔离可以在不同的时间由不同的线程执行,但它可能不常见.隔离只是JavaScript VM的一个实例,它只有自己的JavaScript堆,正常的进程堆仍然在正常的进程中共享.
- 我认为"Isolate"可用于实现并发GC.上面的定义说每个"隔离"不能用于其他"隔离".但并发GC应检查(或标记)主(或其他)线程(或隔离)的活动对象.怎么可能?
Mark&Sweep GC中的非紧凑扫描操作可以从另一个线程同时执行.其他GC操作,如压缩扫描,清除,标记只能在JS未在隔离区中执行时执行.
- 如何才能保护自己的物品?"隔离"是一个线程而不是一个过程.因此,如果其他线程知道地址,则可以访问该线程的对象.怎么可以保护它?我无法理解自己堆的含义.因为如果其他线程知道地址,它可以被其他线程访问.普通线程可以将它们的堆放在内存空间中.由于堆的地址空间没有完全分离,但如果一个线程malloc一个内存,除非其他人知道地址,否则其他线程如何使用它呢?每个线程只是malloc自己的堆空间和"Isolate"有自己的堆空间有什么区别?
那么你不知道地址,也不可能让它坚持V8 API.即使你可以获得地址,地址也不安全使用,因为V8不断地在其堆中移动东西.并且malloc不会返回指向某些隔离的js堆的地址,因为很明显,内存已经被隔离区进行了malloced.