Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Ontico
Artisto - первое в мире мобильное приложение для обработки видео с помощью нейросетей в стиле картин художников и любых исходных изображений. Приложение вошло в топы AppStore и Google Play в США.
В рамках доклада расскажу:
- как научить нейросети рисовать, а, главное, красиво и быстро;
- про особенности переноса стиля на видео;
- про технологический стек.
Введение в архитектуры нейронных сетей / HighLoad++ 2016Grigory Sapunov
Slides from HighLoad++ 2016 conference.
Introduction into neural network architectures (Rus)
Презентация для конференции HighLoad++ 2016.
http://www.highload.ru/2016/abstracts/2454.html
Видеозапись доклада:
https://www.youtube.com/watch?v=XY5AczPW7V4
Современные архитектуры диалоговых систем / Анатолий Востряков (Segmento)Ontico
В докладе я рассмотрю современные архитектуры диалоговых систем или чат-ботов. Неполный список архитектур влючает Dual Encoders, Neural Conversational Networks with and without context, Generative Hierarchical Neural Networks, Memory Networks and Dynamic Memory Networks. В том числе немного коснемся использования Reinofcement Learning в диалоговых системах. Вначале будет мягкое введение в Deep Learning for NLP для лучшего понимания представленных архитектур.
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
Unity3D - это внушительный набор средств для кроссплатформенной разработки игр и 3D-приложений. Однако ряд его особенностей может привести к внезапному падению производительности продукта на мобильных платформах.
Где же прячутся подводные камни? Как обеспечить оптимальный user experience на старом смартфоне? Каких "граблей" стоит избегать при написании кода и подготовке графики? Рассмотрим на примере RPG "Гильдия Героев" для Android и iOS.
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Ontico
Artisto - первое в мире мобильное приложение для обработки видео с помощью нейросетей в стиле картин художников и любых исходных изображений. Приложение вошло в топы AppStore и Google Play в США.
В рамках доклада расскажу:
- как научить нейросети рисовать, а, главное, красиво и быстро;
- про особенности переноса стиля на видео;
- про технологический стек.
Введение в архитектуры нейронных сетей / HighLoad++ 2016Grigory Sapunov
Slides from HighLoad++ 2016 conference.
Introduction into neural network architectures (Rus)
Презентация для конференции HighLoad++ 2016.
http://www.highload.ru/2016/abstracts/2454.html
Видеозапись доклада:
https://www.youtube.com/watch?v=XY5AczPW7V4
Современные архитектуры диалоговых систем / Анатолий Востряков (Segmento)Ontico
В докладе я рассмотрю современные архитектуры диалоговых систем или чат-ботов. Неполный список архитектур влючает Dual Encoders, Neural Conversational Networks with and without context, Generative Hierarchical Neural Networks, Memory Networks and Dynamic Memory Networks. В том числе немного коснемся использования Reinofcement Learning в диалоговых системах. Вначале будет мягкое введение в Deep Learning for NLP для лучшего понимания представленных архитектур.
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
Unity3D - это внушительный набор средств для кроссплатформенной разработки игр и 3D-приложений. Однако ряд его особенностей может привести к внезапному падению производительности продукта на мобильных платформах.
Где же прячутся подводные камни? Как обеспечить оптимальный user experience на старом смартфоне? Каких "граблей" стоит избегать при написании кода и подготовке графики? Рассмотрим на примере RPG "Гильдия Героев" для Android и iOS.
Modern neural net architectures - Year 2019 versionGrigory Sapunov
Slides from the talk on UseData 2019 conference. Describes what happened in the NN architecture space in the last two years. Focus on production-ready things. Other interesting but more research-related topics (like Graph networks) are not covered here.
Пишем самый быстрый хеш для кэширования данныхRoman Elizarov
Типичный случай — приложению работающему с БД некоторые объекты нужны так часто, то их необходимо кэшировать в памяти. В этом случае их кладут в структуру данных типа хэш. Однако, бывают случаи, когда даже поиск в этом хэше становится узким местом приложения и решения из стандартных библиотек перестают устраивать по своей производительности.
Основной упор доклада будет не на конкретный алгоритм, а на та техниках дизайна быстрых алгоритмов — на что надо обращать внимание, как вообще подходить к решению подобных задач.
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Ontico
В докладе рассмотрим нашу старую архитектуру пайплайна машинного обучения, обратим внимание на ее недостатки как с точки зрения инфраструктуры и автоматизации, так и с точки зрения настройки моделей машинного обучения и проведения экспериментов. Разберемся с архитектурой Apache Spark, и почему мы решили его использовать. Подробно ознакомимся с новой архитектурой нашего пайплайна и тем, как она позволила оптимизировать обнаружение и устранение проблем, ускорила и упростила работу data scientist'ов по проведению экспериментов и доведения их до продакшена. Также затронем вопросы написания тестов и процесса разработки ПО на больших данных.
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...Ontico
В какой-то момент кто-то в интернете решил: всё, что мы можем вычислить, мы должны вычислить где-то на “большой мощной машине”. Так родилась заново идея “тонкого клиента”, поработившая сознание разработчиков современных веб-приложений. Всё, на что способно пользовательское приложение, в 90% кейсов сегодня - красиво отрисовать контент по данным, рассчитанным удаленной машиной в одном из дата-центров. При этом сложность расчетов и разнообразие данных растет быстрее, чем линейно, требуя все больше вычислительных ресурсов “больших мощных машин”, а также усилий по их проектированию, разработке, сопровождению, что в конечном счете приводит ко все более возрастающей стоимости владения. Однако, при этом растет разнообразие и, что немаловажно, мощность клиентских мобильных девайсов - основных потребителей того самого контента.
Парадокс заключается в том, что рост этот не приводит к очередной смене парадигмы разработки, никто не хочет переносить вычисления к клиенту и тем самым снижать возрастающие затраты эксплуатации. Отчасти это объясняется понятным образом: ресурсы мобильных устройств ограничены памятью и временем работы от аккумулятора, их хочется экономить.
Однако, чем дальше развивается эта аппаратно-программная история, тем всё менее убедительно выглядят такие аргументы. Пора запустить очередную фазу развития спирали - вернуться к разговору о новых “толстых клиентах” с новыми знаниями о том, как экономить исчерпаемые ресурсы их аппаратной части. И да - клиентов много, их вычисления нам ничего не стоят.
В этом докладе будет рассказано о том:
- почему уже хорошо перемещать вычисления к мобильному клиенту, а не нагружать серверную часть;
- какие средства доступны для разработчика на одной из мобильных платформ;
- какие трюки позволят сократить время вычислений и энергопотребление;
- почему быстро - не всегда энергоэффективно.
А также немного поговорим о вычислительной моде. Модные API прямо в телефоне:
- CNN (сверточная нейронная сеть) с железным ускорением.
- Металлические сети компараторов.
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
Talk of Julik Tarkhanov, senior backend engineer, WeTransfer, Amsterdam, at Ruby Meditation #28 Kyiv 26.10.2019
Next conference - http://www.rubymeditation.com/
It is often a choice, sometimes a whim, and sometimes an act of desperation. We idolise reuse while sometimes the road not taken is just as exciting. Let's chat about where it is appropriate to "do the thing again", take the scenic route and enjoy the view.
Announcements and conference materials https://www.fb.me/RubyMeditation
News https://twitter.com/RubyMeditation
Photos https://www.instagram.com/RubyMeditation
The stream of Ruby conferences (not just ours) https://t.me/RubyMeditation
* The channel of the organizers of the meetup https://t.me/incredevly
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPFlyElephant
Презентация с первого технического вебинара FlyElephant, на котором были рассмотрены основы распараллеливания С/С++ программ при помощи OpenMP и рассказано о функционале FlyElephant.
Видео презентации: https://youtu.be/X1bqBPnJaHM
Сайт FlyElephant: http://flyelephant.net/
ПРОГРАММА БЕТА-ТЕСТИРОВАНИЯ FLYELEPHANT: http://flyelephant.net/beta/
Modern neural net architectures - Year 2019 versionGrigory Sapunov
Slides from the talk on UseData 2019 conference. Describes what happened in the NN architecture space in the last two years. Focus on production-ready things. Other interesting but more research-related topics (like Graph networks) are not covered here.
Пишем самый быстрый хеш для кэширования данныхRoman Elizarov
Типичный случай — приложению работающему с БД некоторые объекты нужны так часто, то их необходимо кэшировать в памяти. В этом случае их кладут в структуру данных типа хэш. Однако, бывают случаи, когда даже поиск в этом хэше становится узким местом приложения и решения из стандартных библиотек перестают устраивать по своей производительности.
Основной упор доклада будет не на конкретный алгоритм, а на та техниках дизайна быстрых алгоритмов — на что надо обращать внимание, как вообще подходить к решению подобных задач.
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Ontico
В докладе рассмотрим нашу старую архитектуру пайплайна машинного обучения, обратим внимание на ее недостатки как с точки зрения инфраструктуры и автоматизации, так и с точки зрения настройки моделей машинного обучения и проведения экспериментов. Разберемся с архитектурой Apache Spark, и почему мы решили его использовать. Подробно ознакомимся с новой архитектурой нашего пайплайна и тем, как она позволила оптимизировать обнаружение и устранение проблем, ускорила и упростила работу data scientist'ов по проведению экспериментов и доведения их до продакшена. Также затронем вопросы написания тестов и процесса разработки ПО на больших данных.
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...Ontico
В какой-то момент кто-то в интернете решил: всё, что мы можем вычислить, мы должны вычислить где-то на “большой мощной машине”. Так родилась заново идея “тонкого клиента”, поработившая сознание разработчиков современных веб-приложений. Всё, на что способно пользовательское приложение, в 90% кейсов сегодня - красиво отрисовать контент по данным, рассчитанным удаленной машиной в одном из дата-центров. При этом сложность расчетов и разнообразие данных растет быстрее, чем линейно, требуя все больше вычислительных ресурсов “больших мощных машин”, а также усилий по их проектированию, разработке, сопровождению, что в конечном счете приводит ко все более возрастающей стоимости владения. Однако, при этом растет разнообразие и, что немаловажно, мощность клиентских мобильных девайсов - основных потребителей того самого контента.
Парадокс заключается в том, что рост этот не приводит к очередной смене парадигмы разработки, никто не хочет переносить вычисления к клиенту и тем самым снижать возрастающие затраты эксплуатации. Отчасти это объясняется понятным образом: ресурсы мобильных устройств ограничены памятью и временем работы от аккумулятора, их хочется экономить.
Однако, чем дальше развивается эта аппаратно-программная история, тем всё менее убедительно выглядят такие аргументы. Пора запустить очередную фазу развития спирали - вернуться к разговору о новых “толстых клиентах” с новыми знаниями о том, как экономить исчерпаемые ресурсы их аппаратной части. И да - клиентов много, их вычисления нам ничего не стоят.
В этом докладе будет рассказано о том:
- почему уже хорошо перемещать вычисления к мобильному клиенту, а не нагружать серверную часть;
- какие средства доступны для разработчика на одной из мобильных платформ;
- какие трюки позволят сократить время вычислений и энергопотребление;
- почему быстро - не всегда энергоэффективно.
А также немного поговорим о вычислительной моде. Модные API прямо в телефоне:
- CNN (сверточная нейронная сеть) с железным ускорением.
- Металлические сети компараторов.
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
Talk of Julik Tarkhanov, senior backend engineer, WeTransfer, Amsterdam, at Ruby Meditation #28 Kyiv 26.10.2019
Next conference - http://www.rubymeditation.com/
It is often a choice, sometimes a whim, and sometimes an act of desperation. We idolise reuse while sometimes the road not taken is just as exciting. Let's chat about where it is appropriate to "do the thing again", take the scenic route and enjoy the view.
Announcements and conference materials https://www.fb.me/RubyMeditation
News https://twitter.com/RubyMeditation
Photos https://www.instagram.com/RubyMeditation
The stream of Ruby conferences (not just ours) https://t.me/RubyMeditation
* The channel of the organizers of the meetup https://t.me/incredevly
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPFlyElephant
Презентация с первого технического вебинара FlyElephant, на котором были рассмотрены основы распараллеливания С/С++ программ при помощи OpenMP и рассказано о функционале FlyElephant.
Видео презентации: https://youtu.be/X1bqBPnJaHM
Сайт FlyElephant: http://flyelephant.net/
ПРОГРАММА БЕТА-ТЕСТИРОВАНИЯ FLYELEPHANT: http://flyelephant.net/beta/
Javascript-фреймворки: должен остаться только одинSergey Xek
Рассказ от tech-менеджера о том, как мы в Acronis выбирали фреймворк в условиях, когда любое более-менее важное технологическое решение сразу затрагивает с десяток команд, несколько сотен человек и права «случайно все сломать» нет.
В докладе пойдет речь о том, что производительность фронтенда — это больше про слаженную работу команды, про понятный и масштабируемый код, чем про сухие циферки. Но циферки тоже будут.
1) Какие у нас были проблемы с текущим фреймворком — UI, архитектура, код.
2) Как измеряли, что примерно стоит брать (исследование популярности).
3) Что рассматривали.
4) На пути к демо-проекту, какие были сложности (то, что уперли идею с Typescript, собственный компилятор шаблонов, четыре Flux-фреймворка и все плохи).
5) Два пилотных демо-проекта: цифры.
6) Оценка трудоемкости перехода.
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
Рассказ от tech-менеджера о том, как мы в Acronis выбирали фреймворк в условиях, когда любое более-менее важное технологическое решение сразу затрагивает с десяток команд, несколько сотен человек и права «случайно все сломать» нет.
В докладе пойдет речь о том, что производительность фронтенда — это больше про слаженную работу команды, про понятный и масштабируемый код, чем про сухие циферки. Но циферки тоже будут.
1) Какие у нас были проблемы с текущим фреймворком — UI, архитектура, код.
2) Как измеряли, что примерно стоит брать (исследование популярности).
3) Что рассматривали.
4) На пути к демо-проекту, какие были сложности (то, что уперли идею с Typescript, собственный компилятор шаблонов, четыре Flux-фреймворка и все плохи).
5) Два пилотных демо-проекта: цифры.
6) Оценка трудоемкости перехода.
SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только одинSECON
Рассказ от tech-менеджера о том, как мы в Acronis выбирали фреймворк в условиях, когда любое более-менее важное технологическое решение сразу затрагивает с десяток команд, несколько сотен человек и права «случайно все сломать» нет. В докладе пойдет речь о том, что хорошо работающий фронтенд — это больше про слаженную работу команды, про понятный и масштабируемый код, чем про сухие циферки. Но и циферки тоже будут.
1) Какие у нас были проблемы с текущим фреймворком — UI, архитектура, код.
2) Как измеряли, что примерно стоит брать (исследование популярности).
3) Что рассматривали.
4) На пути к демо-проекту, какие были сложности (то, что уперли идею с Typescript, собственный компилятор шаблонов, четыре Flux-фреймворка и все плохи).
5) Два пилотных демо-проекта: цифры.
6) Оценка трудоемкости перехода.
SECON'2016. Аверин Сергей, Javascript-фреймворки: должен остаться только одинSECON
Рассказ от tech-менеджера о том, как мы в Acronis выбирали фреймворк в условиях, когда любое более-менее важное технологическое решение сразу затрагивает с десяток команд, несколько сотен человек и права «случайно все сломать» нет.
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Демоны в большом проекте – проблемы и их решения (Redis, RabbitMQ, Skytools, Node.JS, HBase)", Александр Чистяков (ведущий разработчик Cezurity)
Аннотация
Когда команда разработчиков собирается написать новый сервис, у нее, как правило, отсутствует свободное время, но есть необходимый энтузиазм. Из-за нехватки времени многие архитектурные решения приходится принимать, руководствуясь общими соображениями, так как провести всесторонние тесты имеющихся на рынке средств в краткие сроки невозможно. Мы, специалисты компании Cezurity, начали свой проект не вчера, и уже накопили некоторый опыт использования технологий, появившихся сравнительно недавно - таких как Skytools, Node.JS, RabbitMQ и Redis. О том, какие возникли проблемы при внедрении этих средств, и какие их ограничения пришлось преодолевать и учитывать - мой доклад. Кроме того, я расскажу о новом направлении в нашей деятельности - внедрении HBase для хранения большого объема данных.
Биография
Докладчик - узкий специалист широкого профиля, относит себя к виду, называемому в современной англоязычной литературе термином "DevOps". Любит принимать участие в создании сложных систем и постоянно это делает. Никогда не работал в Яндексе, компенсировав это работой в Mail.Ru и некоторых других местах.
Доклад от Parallels:
Методики тестировния производительности database-centric приложений
Описание: При работе над сложными продуктами в database-centric приложениях изменения в коде и тем более в SQL запросах к базе данных могут приводить к неожиданным падениям производительности или же деградации производительности приложения с ростом размера базы данных. Поэтому важно уметь как можно быстрее отлавливать и исправлять причины таких деградаций.
Доклад о том, как устроен процесс мониторинга производительности продукта автоматизации хостинга и облачных сервисов Parallels Automation, для которого определяющим фактором является производительность базы данных.
Компания покажет, как анализирует планы исполнения SQL запросов внутри PostgreSQL, как проверяет насколько быстро и эффективно в целом работают SQL запросы, как определяет стратегию дальнейшей оптимизации.
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Ontico
Оперативная память становится всё более дешёвой и производительной, что позволяет использовать её для хранения рабочего набора данных всё большего числа приложений. Хранение всех данных в оперативной памяти позволяет сделать их высоко доступными, а алгоритмы для работы с данными либо существенно упростить, либо ускорить, а иногда — и то, и другое.
Тезисы - http://www.highload.ru/2015/abstracts/1964.html
2. SAFE HARBOR
• Контент этого доклада не является
единственной истинной в последней инстанции.
• Если вы увидели что-то, что считаете
неправдой - не бойтесь сказать об этом
докладчику.
2
3. Кто я такой
• Меня зовут Александр.
• Software Engineer в Aeneas Platform.
• Студент в КНУ, кибернетика.
• Пишу на Scala, Java/Kotlin, C++ и JS.
• github.com/Fly-Style
3
4. О чем доклад
• Многопоточность
+ производительности
- сложность кода
• JS и многопоточность
4
6. Текущее положение дел
• JS-engines – однопоточные.
• Неблокирующий I/O в одном потоке.
• Web-worker – не панацея.
• ChakraCore !-> napa.js.
6
7. Thread support : Pros
• Несколько выполняемых задач одновременно на
железе.
• Скорость выполнения программы
увеличивается.
7
8. Пример
!// 1
new Thread(function() {
console.log("Hello, threads!");
}).join();
!// 2
new Thread(() !=> {
console.log("Hello, lambdas inside!");
}).join();
8
9. Thread support : Pros
• Специальные структуры данных в языке для
пользовательских приложений.
• Многопоточность в помощь асинхронному
программированию.
9
10. Пример
async function task1() = { … };
async function task2() = { … };
const finalResult = task(await task1(), await task2());
10
12. Thread support : Cons
• Усложняется код.
• Синхронизация потоков над общими данными.
• Сложно для восприятия.
12
13. Давайте пофантазируем…
• Что делать инженерам V8 (JSCore, ChakraCore,
SpiderMonkey, TeaVM)?
• Сначала обратимся к основам CS.
13
14. Архитектура фон Неймана
• Память однородна : команды и данные
хранятся в одной памяти.
• Адресность памяти : память разделена на
нумерованные ячейки.
• Программное управление памятью : все
вычисления должны быть представлены в виде
программы, состоящей из последовательности
управляющих слов — команд.
14
15. Как устроена память
• Процессор (708 байт в x86-64)
• Кэши L1-L3 (1 - 16 Mб)
• RAM (4 - 64 Гб) – доступна разработчикам.
• Внешние накопители
15
16. Но люди не пишут
прямые команды
процессору!
16
18. Абстрактная машина
• Абстрактная машина исполняет код на
высокоуровневом языке.
• Вас не должно волновать, каким именно
образом достигается результат.
• А вот инженеров этой самой машины - как раз
очень должно волновать.
18
20. Memory Model
• В последовательных программах все команды
исполняются последовательно.
• Обращения к памяти тоже происходят
последовательно.
• В многопоточных же программах все иначе :
потоки обращаются к общей памяти, из-за чего
ожидаемого результата может и не быть!
20
21. Memory Model
• Формализованная модель памяти нужна для
того, чтобы специфицировать поведение
программы отношениями порядка записи и
чтения.
• А именно ответить на вопрос :
• Какое конкретное значение может увидеть
конкретное чтение в программе?
21
22. IRIW
atomic var a, b
Thread 1 Thread 2 Thread 3 Thread 4
a = 1 b = 1
let r1 = a
let r2 = b
let r3 = b
let r4 = a
• Какие допустимые значения кортежа
(r1, r2, r3, r4)?
22
23. IRIW
atomic var a, b
Thread 1 Thread 2 Thread 3 Thread 4
a = 1 b = 1
let r1 = a
let r2 = b
let r3 = b
let r4 = a
• Например, (r1, r2, r3, r4) = (0, 1, 0, 1)
нежелателен, потому что теряется порядок
применения операций load / store.
23
24. IRIW
atomic var a, b
Thread 1 Thread 2 Thread 3 Thread 4
a = 1 b = 1
let r1 = a
let r2 = b
let r3 = b
let r4 = a
• В зрелых моделях памяти это ограничение
называется «multiple copy atomicity» – запись
видят или все потоки, или никакой из потоков.
24
25. Memory Model
• Модель памяти про определение отношений
порядков между действиями чтения/записи в
программе
• … и наложения ограничений на исполнение
программы через т.н. «барьеры чтения/записи».
25
26. Без ограничений на исполнение программы в каждом из
перечисленных типов порядков, получим С89 в миниатюре.
Поэтому это нам нужно (глава 27)
26
30. Lock
• Для блокировки необходимы объекты
синхронизации.
• Такими объектами являются локи.
• Примерами локов являются : mutex,
lock_guard, unique_lock из С++.
30
31. Пример Lock
let lock = new Mutex();
!//…
lock.lock();
doSomeTask();
lock.unlock();
31
32. Monitors
• Условные переменные (conditional variable) или
монитор.
• Храним информацию о блокировке в метаинформации
объекта, например.
32
33. Пример
let condVar = new СonditionalVariable();
condVar.wait(lock);
doSomeTask();
condVar.notify(); !// Notify one thread or promise.
condVar.notifyAll(); !// Notify all threads and promises.
33
34. Lockless / Atomic
• Хитрые хардверщики в своих изыскахЪ
подвезли нам возможность за одну инструкцию
дешево, безопасно и почти безболезненно
сделать запись в память.
• Правда есть одно «но» : применимо только для
примитивов и ссылок.
34
35. Пример
let atomicInt = new AtomicInteger();
atomicInt.compareAndExchange(1, 2);
!// !=> true, atomic = 2.
atomicInt.compareAndExchange(1, 3);
!// !=> false, atomic = 2.
35
37. Lockless / Atomic : Pros
• Лучше масштабируемость.
• Применяется в lock-free структурах данных, где
важна производительность.
37
38. Transactional Memory
• Технология транзакционной памяти упрощает
параллельное программирование, выделяя группы
инструкций в атомарные транзакции.
• В этом случае мы считаем, что потоки работают
независимо друг от друга и в редких случаях изменяют
одни и те же данные.
38
39. И вот если принести вот это все
абстрактному инженеру этой самой
виртуальной машины для JS, то …
39
43. Дизайн потоков
• Поток – это отдельная единица выполнения
кода, связанная с остальными только общей
памятью.
• Каждый поток должен иметь свои виртуальные
регистры, stack pointer и program counter.
43
44. Выбор «бэкэнда» для
потока
• Есть два варианта :
• Kernel thread – полноценная и отдельная нить
исполнения.
• Fiber a.k.a. Волокна – легкая нить, не
выполняется явно параллельно!
44
45. Варианты реализации
• Нативная вытесняющая многопоточность
(Java, C#)
• Кооперативная многопоточность внутри VM
(Erlang).
• Виртуальная многопоточность (Python, Ruby)
45
46. Варианты реализации
• Нативная вытесняющая многопоточность
(Java, C#)
• Кооперативная многопоточность внутри VM
(Erlang).
• Виртуальная многопоточность (Python, Ruby)
46
47. Нативная вытесняющая
многопоточность
• Каждый поток выполняется поверх
назначенному ему нативному потоку ОС.
• Переключение и планировка потоков
осуществляется планировщиком ОС.
• Так как переключения VM не контролирует,
часто внутри кода VM нужны критические
секции.
47
48. Дизайн класса потока
• Если дизайнить Thread как класс, то в прототипе
необходимо определить :
1. конструктор с функцией в качестве параметра, в
которой будет определён блок с параллельным
кодом.
2. метод, который будет исполнять параллельный код.
3. метод, который будет дожидаться конца
исполнения и «парковать» освободившийся поток.
48
49. Дизайн класса потока
class Thread {
constructor(runner: function) {…}
join(thread: Thread) {…}
start() {…}
}
49
50. Пример
!// 1
new Thread(() !=> {
console.log("Hello, Thread!");
}).join();
!// !=> Hello, Thread!
!// 2
let print = () !=> console.log("Hello");
let thread = new Thread(print).start();
thread.join();
!// !=> Hello!
50
52. Выделение памяти :
проблемы
• Диспетчеры памяти обычно пишутся на языке,
отличном от языка таргета (С++ и JS).
• Поэтому выделение памяти одному потоку имеет
более-менее оправданную скорость, а вот многим -
скорее всего нет.
52
53. Выделение памяти :
проблемы
• Для оптимизации надо позволить потокам выделять
целые блоки памяти для своих нужд.
• Такие блоки памяти называются Thread-Local
Allocation Buffers (a.k.a. TLAB).
53
54. Bump pointer allocation
• Аллоцируем по адресу текущего указателя TLAB +
размер объекта.
• Если мы запрашиваем выделение объекта, который
превышает размер TLAB, мы выделяем напрямую.
54
57. VM safepoint : Ideas
• Иметь безопасный доступ к памяти.
• Кооперативно остановить потоки.
• Знать, когда нам точно надо уйти на GC паузу.
57
58. VM safepoint : Problems
• Остановить потоки не так-то и просто.
• Во время критической секции, например.
• Или во время т.н. «короткого» цикла.
58
59. GC : Problems
• Определение rootset становится еще большей
проблемой : надо сканировать стеки всех потоков.
• Анализ достижимости объектов и hidden классов.
• Достижимость кода из Code Space.
59
63. DOM Interaction
• ConcurrentAccessError при попытке записи из
пользовательских потоков.
• Также запретить concurrent доступ ко всем
глобальным объектам.
• Но console, пожалуй, стоит пожалеть :)
63
64. В моде глобальное состояние приложения.
Concurrent DOM Interaction не нужен 🙁.
64
66. • Создавать виртуальные машины сложно!
• Вносить изменения в VM ещё сложнее!
• Мечтать – приятно и очень познавательно!
• Многопоточность – сложно!
• Бенефит от использования перевешивает минусы!
66
67. Useful books and links
1. Блог WebKit о JS Concurrency.
2. Xiao Feng Li – Advanced Design and Implementation of VM.
3. Richard Jones, Antony Hosking, Eliot Moss – GC Handbook.
67