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