В блоге одного из разработчиков браузера Mozilla Firefox появился пост с сообщением о продолжении работ по переводу браузера на многопроцессную архитектуру. Напомним, что некоторое время назад проект Electrolysis, в рамках которого и производились разработки по переходу Firefox на многопроцессную архитектуру, был заморожен. Проект предусматривал реализацию работы браузера таким образом, чтобы работа пользовательского интерфейса и обработка контента веб-страниц производились в рамках разных процессов. Теперь же в план включено и рассмотрение вопрос об изоляции в разные процесс отдельных вкладок (как в Google Chrome) групп вкладок или веб-страниц, расположенных на одном сайте.
Следует отметить, что некоторая часть кода, разработанного в рамках проекта Electrolysis уже была внедрена в браузер, в четвертой ветке. Он используется, например, для изоляции в отдельных процессах сторонних плагинов. А в мобильной версии Firefox 4 для операционной системы Android разные вкладки уже обрабатываются разными процессами. Вместе с тем, разработчики сообщают, что процесс перевода браузера на многопроцессную архитектуру связан со значительными трудностями, так что займет не один месяц. По планам разработчиков, учитывая новый цикл разработки Firefox и выпуск релизов каждые полтора месяца, первые результаты работы проекта будут внедрены в восьмую версию браузера. При этом, по заявлению Mozilla, каждое новое поколение обозревателя будет более быстрым, стабильным и отзывчивым, чем предыдущее.
По каким же причинам необходим переход на многопроцессорную архитектуру? В качестве факторов, имеющих значительное влияние на смену архитектуры браузера, называются следующие.
Повышение производительности. Основным преимуществом разделения частей браузера, отвечающих за обработку контента и управление элементами интерфейса, на разные процессы является повышение скорости ответа на действия пользователя браузера и ликвидация так называемых «фризов», то есть ситуаций, когда браузер как бы замирает на несколько секунд. На сегодняшний момент разработчики пытаются организовать вызов подсистемы управления пользовательским интерфейсом не реже чем в 50 микросекунд (речь идет об однопроцессорной модели). Тем не менее пользователи все равно жалуются на «тормоза» браузера. Еще более ускорить работу браузера в условиях однопроцессной модели практически невозможно, поскольку обработка контента и элементов интерфейса производится в одном хранилище и в один поток. Чем больше времени проходит после запуска, тем сильнее чувствуется фрагментация хранилища пользовательской информации, что заставляет сборщик мусора тратить больше времени на поиск неиспользуемых объектов.
А когда сборщик мусора работает, другие подсистемы вынуждены останавливать свою работу, что, в конечном итоге, и приводит к подвисаниям, на которые жалуются пользователи. В Mozilla Firefox 4 эту проблему попытались решить за счет уменьшения времени активации сборщика мусора и использования отдельных сборщиков для разных видов объектов в хранилище. По отзывам пользователей, скорость работы браузера выросла, но еще далека от идеальной. В частности, подвисания продолжают наблюдаться при очистке хранилища после работы больших веб-приложений.
Оптимизация под современные многоядерные процессоры. В настоящее время для обработки контента и создания элементов интерфейса браузер использует только одно ядро центрального процессора, при этом остальные ядра простаивают. Другие ядра используются только при запуске сторонних плагинов, если в них включена соответствующая функциональность. Попытки использования многопоточности для обработки изображений, видео и звука с помощью процессора графического ускорителя и/или другими ядрами центрального процессора не снимают остроты проблемы.
Сетевые операции ввода вывода, формирование содержимого окна браузера, анализ HTML-кода, выполнение скриптов JavaScript по-прежнему выполняются в одном потоке, то есть используется только одно ядро процессора. В будущих версиях браузера разработчики планируют организовать возможность запуска нескольких обработчиков DOM в качестве отдельных процессов, работающих параллельно. В качестве альтернативы данном решению, разрабатывается технология многопоточной обработки дерева DOM, в которой будет поддерживаться автоматическое управление выделенной памятью и выполнение сопрограмм.
Потребление памяти станет предсказуемым. Одним из самых значительных недостатков браузера Firefox часто называется значительное потребление оперативной памяти. Это связано с большой фрагментацией, проблемами с перераспределением выделенной памяти, невозможность ее освобождения, а также тривиальные утечки. Безусловно, проблема не является уникальной для браузера и возникает у любого процесса, который активно использует блоки памяти в своей работе. Процесс постоянно запрашивает у операционной системы блоки памяти разного размера. С течение времени память освобождается, но, к сожалению, остаются небольшие части не освобожденной памяти, что приводит к росту ее фрагментации. Процесс, которому снова требуется память, не может использовать не полностью опустошенные блоки и вынужден получать новые блоки у операционной системы, сохраняя под своим управление не использующиеся блоки памяти.
После перевода браузера на многопроцессную архитектуру эта проблема будет практически решена. Страницы сайтов будут обрабатываться в рамках разных процессов, и после окончания обработки процесс будет возвращать операционной системе всю память, вместо оставления ее в своем распоряжении как происходит сейчас. Таким образом, потребление памяти значительно снизиться, что избавит пользователей браузера от надоевшей проблемы.
Увеличение стабильности за счет защиты от сбоев. В случае однопроцессной схемы обработки данных, любая нештатная ситуация, например, выход за пределы буферной зоны, приведет к падению обозревателя. Если же каждая веб-страница будет обрабатываться отдельным процессом, то в случае нештатной ситуации упадет лишь один процесс, то есть закроется лишь одна вкладка. Весь браузер при этом не пострадает. Плюс с этому, для разработчиков будет упрощена необходимость диагностики краха, в том числе за счет того, что они будут точно знать какой именно сайт и какая именно операция привели к падению. Частично, подобная функциональность уже реализована на примере выделения сторонних плагинов в отдельные процессы. По этой причине в четвертой версии Firefox значительно снизилась частота падений браузера, связанная с использованием плагина Flash.
Повышение безопасности браузера. Переход на многопроцессную архитектуру позволит разработчикам изолировать код, связанный с определенным сайтов, от кода других сайтов и кода, отвечающего за обработку и вывод интерфейса. Операционная система при необходимости позволяет дать тому или иному процессу более низкий уровень прав, блокируя доступ к системным ресурсам компьютера. Снижение прав отдельных процессов позволить лишить преступников возможности использовать уязвимости в браузере для выполнения зловредного кода, заперев его в так называемой «песочнице». Таким образом, атака злоумышленника сможет быть успешной только в случае использования уязвимости в процессе с повышенными правами. Как показывает опыт Google Chrome за все время использования многопроцессной архитектуры было обнаружено считанное число уязвимостей, способных преодолеть несколько уровней защиты.