Какова роль Isolate в V8? и как можно сделать Изолировать изолированно?

Объяснения «Изолировать», что я нашел до сих пор.

пример № 1: http://izs.me/v8-docs/classv8_1_1Isolate.html

«Изолят представляет собой изолированный экземпляр ядра V8. Изоляты V8 имеют совершенно разные состояния. Объекты из одного изолята не должны использоваться в других изолятах. При инициализации V8 неявно создается и вводится изолят по умолчанию. используйте их параллельно в нескольких потоках. В любой момент времени изолировать может только один поток. Для синхронизации можно использовать API Locker/Unlocker».

пример № 2: https://developers.google.com/v8/get_started

«Изолят — это экземпляр виртуальной машины с собственной кучей».

Да я вижу. «Изолировать» — это изолированный поток, который может работать отдельно. Далее мои вопросы.

  1. Для меня это выглядит как просто поток, за исключением того, что у него есть собственная куча. есть ли разница?

  2. Я думаю, что «Изолировать» можно использовать для реализации параллельного GC. В приведенном выше определении говорится, что каждый «Изолировать» не может использоваться в другом «Изолировать». Но параллельный сборщик мусора должен проверять (или помечать) основные (или другие) потоки (или изолировать) живые объекты. Как это возможно?

  3. Как можно защитить собственные объекты? «Изолировать» — это поток, а не процесс. Таким образом, другой поток может получить доступ к объекту этого потока, если он знает адрес. Как мог защитить его? И я не могу понять смысл собственной кучи. Потому что к нему может получить доступ другой поток, если другой поток знает адрес. И обычный поток может иметь свою кучу в памяти. Поскольку адресное пространство кучи не отделено точно, но если один поток выделяет память, как другой поток может использовать ее, если другие не знают адрес? Какая разница, что каждый поток просто выделяет свое собственное пространство кучи, а «Изолировать» имеет свое собственное пространство кучи?

Мои вопросы можно легко резюмировать: какова роль «Изолята» и как возможно иметь собственное пространство кучи и почему у него должна быть собственная куча.

Будет очень полезно, если кто-нибудь поделится хорошей документацией по "Isolate". Спасибо за прочтение.

---- Сделайте вопрос ясным ---- Ключевым моментом моего вопроса является то, что Q: Что заставляет Google реализовывать изоляцию в V8? в чем преимущество изоляции и что может быть хорошим примером использования изоляции в V8? Что они (изоляты) выполняют одновременно?


person Joffrey    schedule 27.03.2015    source источник


Ответы (2)


  1. Для меня это выглядит как просто поток, за исключением того, что у него есть собственная куча. есть ли разница?

Они ортогональны, поток может выполнять несколько изолятов одновременно, в то время как изолят может выполняться только одним потоком за раз. И, конечно же, один изолят может выполняться разными потоками в разное время, но это, вероятно, не является распространенным явлением. Изолят — это всего лишь экземпляр виртуальной машины JavaScript, и у него есть только собственная куча JavaScript, обычная куча процесса по-прежнему используется в процессе как обычно.

  1. Я думаю, что «Изолировать» можно использовать для реализации параллельного GC. В приведенном выше определении говорится, что каждый «Изолировать» не может использоваться в другом «Изолировать». Но параллельный сборщик мусора должен проверять (или помечать) основные (или другие) потоки (или изолировать) живые объекты. Как это возможно?

Операция очистки без сжатия в Mark&Sweep GC может выполняться одновременно из другого потока. Другие операции GC, такие как сжатие, очистка, маркировка, могут выполняться только тогда, когда JS не выполняется в изоляции.

  1. Как можно защитить собственные объекты? «Изолировать» — это поток, а не процесс. Таким образом, другой поток может получить доступ к объекту этого потока, если он знает адрес. Как мог защитить его? И я не могу понять смысл собственной кучи. Потому что к нему может получить доступ другой поток, если другой поток знает адрес. И обычный поток может иметь свою кучу в памяти. Поскольку адресное пространство кучи не отделено точно, но если один поток выделяет память, как другой поток может использовать ее, если другие не знают адрес? Какая разница, что каждый поток просто выделяет свое собственное пространство кучи, а «Изолировать» имеет свое собственное пространство кучи?

Ну, вы не знаете адрес, и невозможно заставить его придерживаться V8 API. Даже если бы вы могли получить адрес, использовать его было бы небезопасно, потому что V8 постоянно перемещает данные в своей куче. И malloc не будет возвращать адреса, которые указывают на кучу js некоторого изолята, потому что очевидно, что эта память была распределена изолятом.

person Esailija    schedule 27.03.2015
comment
@Joffrey, любой поток может получить доступ к изоляту, как я уже сказал, однако я также сказал, что вы можете одновременно выполнять только неуплотняющую развертку. Таким образом, нет параллельной маркировки - ни один поток не может запускать js в изоляте, пока маркировка выполняется в его куче. Я пояснил это в своем ответе. - person Esailija; 27.03.2015
comment
спасибо за Ваш ответ. Возможно... мой вопрос не ясен. вопрос № 2 заключается в том, как параллельный GC может пометить и очистить кучу другого изолята? так как каждый изолят не может видеть кучу других. Я думаю, что параллельный сборщик мусора — это пример изоляции. Если так, то это противоречит объяснениям изолята. - person Joffrey; 27.03.2015
comment
@Joffrey GC - внутренний компонент V8, он все видит - person Esailija; 27.03.2015
comment
ты прав. Я должен отредактировать этот вопрос, если ответ не то, что я хочу. Тем не менее, я продублировал аналогичный вопрос, поскольку в этом вопросе четко не указан вопрос. Спасибо за совет. Я действительно имею это в виду, и я отредактирую этот вопрос. - person Joffrey; 30.03.2015

Изолировать: мы можем запускать несколько функций JavaScript независимо, используя один экземпляр V8.

person JaisoN    schedule 27.03.2015
comment
Цитата и ссылка в этом ответе уже упоминаются в вопросе (дословно). Не могли бы вы отредактировать свой ответ и добавить дополнительную (новую) информацию? - person Rob W; 27.03.2015