Новый многопоточный двигатель для браузера Firefox - Servo

Новый многопоточный двигатель для браузера Firefox - Servo

Компания Mozilla вовсю занимается экспериментальной разработкой прототипа под названием Servo.

Цель этого проекта заключается в возможности использования конечного продукта в качестве двигателя для браузера Firefox.

Какие же плюсы видят разработчики в новом двигателе Servo? Прежде всего, это многопоточность и ориентированность на выполнение нескольких параллельных задач. Такое решение позволит улучшить отклик браузера на действия, выполняемые пользователем, а также использовать на полную всю мощь многоядерных архитектур.

Кроме того, создатели планируют улучшить безопасность обозревателя и установить строгий контроль над использованием оперативной памяти.

Кстати, мысль распараллелить задачи ранее уже приходила в головы инженеров Mozilla, когда в 2009 году они запустили проект Electrolysis. По прошествии двух лет проект заморозили, а освободившиеся ресурсы направили на решение иных задач.

Servo позволит решить многие проблемы, присутствующие в браузерах. Как правило, наряду с одним главным потоком в приложениях используется несколько дочерних. А в новом движке все уровни выполнения задач разработчики распараллелят:

• Использование архитектуры, которая ориентирована на выполнение задач. Все главные компоненты веб-браузера выполняют свои задачи с изолированными кусками памяти. Но при этом существует возможность откатить и восстановить любой компонент.
Такое решение предоставит возможность заменять разные части обозревателя и получить большую свободу для исследований и экспериментов. На сегодняшний день эта задача уже выполнена.

• Сбор мусора javascript параллельно с формированием слоев. Как правило, javascript-код дожидается момента полной либо частичной загрузки веб-страницы и формирования слоев. В такие моменты самое время запустить сборщик мусора. Для программирования разработчики выбрали экспериментальный язык Rust, который разрабатывает подразделение Mozilla Research.

Бытует мнение, что скорость написанного на Rust кода близка к C++, однако при этом предоставляются удобные возможности для разработки приложений с параллельным выполнением задач.

• Декодирование других веб-ресурсов. Невзирая на то, что, как правило, на страницах больше изображений, нежели остального контента, параллельный декодинг видео или разбор таблиц стилей позволит улучшить отзывчивость и производительность браузера. Эту задачу разработчики уже частично выполнили.

• Декодирование изображений. Параллельно декодировать несколько изображений достаточно просто и эту задачу разработчики уже осуществили.

• Парсинг веб-страницы. Обработка javascript-кода в несколько потоков требует существенных изменений в движке SpiderMonkey, однако она способна дать хорошие результаты. Кроме того, улучшить показатели производительности позволит использование потоков во время обработки HTML. А вот CSS-анализ будет малоэффективен. В любом случае полный анализ веб-страницы при помощи параллельных потоков вызовет ожидания и сложности в реализации. Пока разработчики эту задачу отложили.

• Формирование текстов. Занимает внушительную часть внутреннего слоя. Это достаточно дорогостоящая операция, но для решения проблемы в ней присутствует потенциал использования потоков. В текущее время задача отложена.

• Распараллеливание обработки слоёв. Создание отрисовки на основе CSS-свойств является достаточно сложной задачей, поэтому ее решение пока отложено.

• Выборка селекторов. Servo, в отличие от Gecko, позволит проводить выборку селекторов, не привязываясь к макету. Это предоставит возможность довольно просто распараллелить задачи. В текущее время задача не выполняется.

• Рендеринг слоёв. Предусматривает использование специального Display-списка в виде субдеревьев. Впоследствии они будут отправлены в GPU и параллельно отрисованы. Эту задачу разработчики уже частично выполнили.

• Плиточный рендеринг. Предусматривает разбитие экрана на отдельные участки, которые будут отрисовываться параллельно. Этот алгоритм в первую очередь полезен для мобильных устройств. Он позволяет обрабатывать только видимую часть веб-страницы. Данную задачу разработчики уже частично выполнили.

• Параллельная отрисовка. Сборка слоев и две задачи отрисовки происходят в отдельных потоках. Таким образом, достигается лучшая отзывчивость интерфейса. Кроме того, сборщик слоев управляет своей памятью, а это исключает случайные паузы во время циклов сборки мусора. С этой задачей разработчики справились.

• Алгоритм Copy-on-write DOM. Предполагается, что DOM структура будет доступна одновременно через компонент макета и компонент контента (выполнение javascript). При этом сборка слоев может происходить при любых действиях с DOM-деревом, будь то чтение узлов, изменение структуры или запись. С этой задачей разработчики частично справились.

Свежие новости про новинки Apple. Слухи и факты о продукции Apple: iPhone, iMac, iPad.