Разработчики Mozilla сообщили об изменениях в работе javascript-движка SpiderMonkey. Они в значительной степени изменили подход к организации параллельного выполнения javascript-кода.
SpiderMonkey будет теперь работать исключительно в однопоточном режиме. Что же касается распараллеливания, к примеру, во время выполнения Parallel javascript или WebWorkers, оно будет производиться за счет запуска отдельных экземпляров SpiderMonkey (JSRuntime) внутри одного процесса. Каждый из этих экземпляров использует непересекающиеся области памяти.
SpiderMonkey перестанет распараллеливать работу, выполняемую в рамках одного экземпляра javascript-движка, однако на каждый новый источник, который обрабатывается, будут запускаться дополнительные экземпляры.
При этом все отдельные экземпляры будут использоваться в контексте своего сборщика мусора. Проще говоря, потребление и фрагментация памяти в данном случае уменьшатся, а быстрота работы движка возрастет для некоторых типов приложений.
Такая схема работы вместо использования для всех объектов javascript общей области памяти подразумевает использование нескольких отдельных "куч".
Концепция, подразумевающая реализацию множественных «куч», называется «отсеки» (compartment). В этом случае каждый отсек является отдельной «кучей» из javascript-объектов аналогичного происхождения.
В то же время, SpiderMonkey имеет возможность создавать много своих экземпляров в рамках одного и того же процесса, каждый из которых доступен через разные потоки.
Впервые поддержка "отсеков" была внедрена в SpiderMonkey 1.8.5, который вошел в состав Firefox 4.0. Она применялась для того, чтобы изолировать javascript-объекты от разных источников.
Применение «отсеков» вызывает как минимум два важных следствия:
1. Все javascript-объекты, которые создает каждый отдельно взятый веб-сайт, располагаются в отдельных отсеках. Это улучшает работу кэша, поскольку они физически располагаются всегда в одном участке памяти.
Если ранее их поиск и выборка в памяти избыточно нагружали процессор, теперь они упакованы последовательно и компактно на небольшом участке памяти, который совершенно не пересекается с остальными javascript-объектами;
2. Последнее связано с другим важным следствием этой стратегии: сегодня javascript-объекты (и javascript-функции, являющиеся частью этих объектов) обращаются только в пределах своих отсеков.
В свете многочисленных потенциальных проблем, связанных с безопасностью в прошлой модели, это чрезвычайно важно.
Чтобы этого добиться разработчики реализовали очень низкоуровневый механизм, гарантирующий сохранность этой изоляции на уровне работы разнородных объектов.
А это означает, что никакие объекты из пространства www.bank.com никак не влияют на работу объектов в отсеке mail.google.com.
А тем временем, в текущей реализации имеется специальный тип объектов, имеющий возможность работать между отсеками поверх границ взаимной изоляции. Такие объекты создаются и контролируются непосредственно самим движком и используются для его системных нужд. Они называются "cross-compartment wrappers".
Справка
SpiderMonkey является встраиваемым javascript-движком с открытым исходным кодом от Mozilla.
Он создан на C/C++ и компания Mozilla использует его в нескольких своих продуктах, среди которых самым известным является Firefox.
Движок распространяется под тройной лицензией - это MPL/GPL/LGPL.
Последним стабильным релизом движка является SpiderMonkey 1.8.5. Он выполнен в виде отдельного встраиваемого модуля.
Кроме того, с небольшими модификациями на нем базируется движок javascript веб-обозревателя Firefox, начиная с версии 4.0.