什么's的作用;隔离“;在V8中?以及如何可能使“;隔离“;孤立地

What's the role of "Isolate" in V8? and how can it be possible to make "Isolate" isolately?

本文关键字:隔离 何可能 V8 作用 什么      更新时间:2023-09-26

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

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

"Isolate代表V8发动机的一个孤立实例。V8隔离具有完全独立的状态。一个隔离区中的对象不得用于其他隔离区。初始化V8时,会隐式创建并输入默认隔离。嵌入程序可以创建额外的隔离,并在多个线程中并行使用它们。在任何给定时间,最多可以由一个线程输入隔离。锁定器/解锁器API可用于同步。"

exp#2:https://developers.google.com/v8/get_started

"隔离是一个有自己堆的VM实例。"

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

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

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

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

我的问题可以很容易地概括为"隔离"的作用是什么,如何才能拥有自己的堆空间,以及为什么必须拥有自己的堆栈。

如果有人分享一些"隔离"的好文档,那将是非常有帮助的。感谢阅读。

----把问题说清楚----我问题的关键是Q: 是什么让谷歌在V8中实现隔离?隔离的好处是什么?在V8中使用隔离的一个好例子是什么?它们(隔离物)同时执行什么?

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

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

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

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

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

你不知道地址,也不可能让它坚持使用V8 API。即使你能得到地址,这个地址使用起来也不安全,因为V8不断地移动堆中的东西。malloc不会返回指向某个隔离区的js堆的地址,因为很明显,隔离区已经对内存进行了malloc操作。

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