Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[SnowOne 2024] Александр Филатов: !concurrent,w...

jugnsk
April 30, 2024

[SnowOne 2024] Александр Филатов: !concurrent,worldHello или многопоточность глазами VM-инженера

Многопоточность — это просто! Написал "myStream.parallel()" и всё ускорилось в 10 раз.

Многопоточность — это сложно! Каждый день что-то не работает, то дедлоки, то гонки, то вообще ABA-проблема.

Многопоточность — это актуально! Закон Мура нарушился, новые нанометры не помогают, а ядер в процессорах с каждым годом всё больше.

Если вам кажется, что нельзя так поверхностно смотреть на вещи и следует разобраться в предмете получше, то помните "И если ты долго смотришь в бездну, то бездна тоже смотрит в тебя". В докладе мы посмотрим на многопоточность глазами системного программиста — инженера виртуальных машин для управляемых языков. Вместе попробуем разгадать, почему он с опаской относится к советам других разработчиков и их коду, почему привык не доверять компиляторам и процессорам, а также чем ему не по душе самые разные языки программирования.

jugnsk

April 30, 2024
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. Знакомство Bio: Александр Филатов Уже 8 лет как VM-инженер1 2015

    - 2019, Excelsior JVM with AOT compilation2 2019 - now, Huawei, Languages and Compilers lab3 1 Иван Углянский, Один день из жизни JVM-инженера, https://habr.com/ru/company/jugru/blog/719614/ 2 https://habr.com/ru/company/jugru/blog/437180/ 3 http://rnew.tilda.ws/excelsiorathuawei Александр Филатов Concurrency: VM engineer point of view 2 / 46
  2. Знакомство Bio: Александр Филатов Уже 8 лет как VM-инженер1 2015

    - 2019, Excelsior JVM with AOT compilation2 2019 - now, Huawei, Languages and Compilers lab3 Специализация – рантаймы виртуальных машин Узкая специализация – сборщики мусора 1 Иван Углянский, Один день из жизни JVM-инженера, https://habr.com/ru/company/jugru/blog/719614/ 2 https://habr.com/ru/company/jugru/blog/437180/ 3 http://rnew.tilda.ws/excelsiorathuawei Александр Филатов Concurrency: VM engineer point of view 2 / 46
  3. Знакомство Bio: Александр Филатов Область интересов: автоматическое управление памятью многопоточность

    слабые модели памяти корректность многопоточных структур данных Александр Филатов Concurrency: VM engineer point of view 3 / 46
  4. Знакомство Bio: Александр Филатов Область интересов: автоматическое управление памятью многопоточность

    слабые модели памяти корректность многопоточных структур данных Персональное когнитивное искажение: много страдал, отлаживая баги своего параллельного кода Александр Филатов Concurrency: VM engineer point of view 3 / 46
  5. Знакомство Bio: Александр Филатов Область интересов: автоматическое управление памятью многопоточность

    слабые модели памяти корректность многопоточных структур данных Персональное когнитивное искажение: много страдал, отлаживая баги своего параллельного кода чужих реализаций многопоточных структур данных Александр Филатов Concurrency: VM engineer point of view 3 / 46
  6. Знакомство Bio: Александр Филатов Область интересов: автоматическое управление памятью многопоточность

    слабые модели памяти корректность многопоточных структур данных Персональное когнитивное искажение: много страдал, отлаживая баги своего параллельного кода чужих реализаций многопоточных структур данных компилятора Александр Филатов Concurrency: VM engineer point of view 3 / 46
  7. Знакомство Bio: Александр Филатов Область интересов: автоматическое управление памятью многопоточность

    слабые модели памяти корректность многопоточных структур данных Персональное когнитивное искажение: много страдал, отлаживая баги своего параллельного кода чужих реализаций многопоточных структур данных компилятора Опасаюсь нового. Не люблю поддерживать старое. Александр Филатов Concurrency: VM engineer point of view 3 / 46
  8. Знакомство Как было получено название доклада !concurrent,worldHello for (String msg

    : new String[] { "Hello", ",", "concurrent", "world", "!" }) { new Thread() { public void run() { System.out.println(msg); } }.start(); } Александр Филатов Concurrency: VM engineer point of view 4 / 46
  9. Знакомство Как было получено название доклада !concurrent,worldHello for (String msg

    : new String[] { "Hello", ",", "concurrent", "world", "!" }) { new Thread() { public void run() { System.out.println(msg); } }.start(); } Александр Филатов Concurrency: VM engineer point of view 4 / 46
  10. Знакомство План выступления 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов Александр Филатов Concurrency: VM engineer point of view 5 / 46
  11. Вы находитесь здесь 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов
  12. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Александр Филатов Concurrency: VM engineer point of view 6 / 46
  13. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Александр Филатов Concurrency: VM engineer point of view 6 / 46
  14. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Проходит время ... Александр Филатов Concurrency: VM engineer point of view 6 / 46
  15. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Проходит время ... Стало медленнее Александр Филатов Concurrency: VM engineer point of view 6 / 46
  16. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Проходит время ... Стало медленнее Зависает Александр Филатов Concurrency: VM engineer point of view 6 / 46
  17. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Проходит время ... Стало медленнее Зависает Код непонятный Александр Филатов Concurrency: VM engineer point of view 6 / 46
  18. Как я вижу программистов Идея №1: давай распараллелим! Обычно бывает

    так Коллега предлагает переписать часть проекта с использованием нескольких потоков Проходит время ... Стало медленнее Зависает Код непонятный Александр Филатов Concurrency: VM engineer point of view 6 / 46
  19. Как я вижу программистов Идея №1: давай распараллелим! Почему так

    происходит? Александр Филатов Concurrency: VM engineer point of view 7 / 46
  20. Как я вижу программистов Идея №1: давай распараллелим! Почему так

    происходит? synchronized(objectA) { synchronized(objectB) { computeStuff(); } } synchronized(objectB) { synchronized(objectA) { computeStuff(); } } Александр Филатов Concurrency: VM engineer point of view 7 / 46
  21. Как я вижу программистов Идея №1: давай распараллелим! Почему так

    происходит? synchronized(objectA) { synchronized(objectB) { computeStuff(); } } synchronized(objectB) { synchronized(objectA) { computeStuff(); } } Легко сломать многопоточную систему неаккуратным изменением. Александр Филатов Concurrency: VM engineer point of view 7 / 46
  22. Как я вижу программистов Идея №1: давай распараллелим! Почему так

    происходит? synchronized(objectA) { synchronized(objectB) { computeStuff(); } } synchronized(objectB) { synchronized(objectA) { computeStuff(); } } Легко сломать многопоточную систему неаккуратным изменением. Это ВСЕГДА случается после написания оригинального кода. Александр Филатов Concurrency: VM engineer point of view 7 / 46
  23. Как я вижу программистов Идея №1: давай распараллелим! Почему так

    происходит? synchronized(objectA) { synchronized(objectB) { computeStuff(); } } synchronized(objectB) { synchronized(objectA) { computeStuff(); } } Легко сломать многопоточную систему неаккуратным изменением. Это ВСЕГДА случается после написания оригинального кода. Александр Филатов Concurrency: VM engineer point of view 7 / 46
  24. Как я вижу программистов Идея №1: давай распараллелим! Выводы Параллелизм

    полезен, но многопоточность приносит с собой: Риски Издержки на поддержку Александр Филатов Concurrency: VM engineer point of view 8 / 46
  25. Как я вижу программистов Идея №1: давай распараллелим! Выводы Параллелизм

    полезен, но многопоточность приносит с собой: Риски Издержки на поддержку Реакция VM-инженера: изыди! Не хочу отлаживать этот код через полгода, после серии несвязанных правок, когда ты уже уволишься. Александр Филатов Concurrency: VM engineer point of view 8 / 46
  26. Как я вижу программистов Идея №1: давай распараллелим! Выводы Параллелизм

    полезен, но многопоточность приносит с собой: Риски Издержки на поддержку Реакция VM-инженера: изыди! Не хочу отлаживать этот код через полгода, после серии несвязанных правок, когда ты уже уволишься. Реакция здорового человека: давай подумаем, стоит ли оно того. Александр Филатов Concurrency: VM engineer point of view 8 / 46
  27. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Взгляд VM-инженера Реальность Александр Филатов Concurrency: VM engineer point of view 9 / 46
  28. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Взгляд VM-инженера Реальность Мои ощущения Александр Филатов Concurrency: VM engineer point of view 9 / 46
  29. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing Александр Филатов Concurrency: VM engineer point of view 10 / 46
  30. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing реализовано на языке Си Александр Филатов Concurrency: VM engineer point of view 10 / 46
  31. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing реализовано на языке Си алгоритм формализован на языке Promela и верифицирован инструментом SPIN Александр Филатов Concurrency: VM engineer point of view 10 / 46
  32. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing реализовано на языке Си алгоритм формализован на языке Promela и верифицирован инструментом SPIN “Using Hardware Transactional Memory to Correct and Simplify and Readers-writer Lock Algorithm”, 2013 Александр Филатов Concurrency: VM engineer point of view 10 / 46
  33. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing реализовано на языке Си алгоритм формализован на языке Promela и верифицирован инструментом SPIN “Using Hardware Transactional Memory to Correct and Simplify and Readers-writer Lock Algorithm”, 2013 20 лет спустя! Александр Филатов Concurrency: VM engineer point of view 10 / 46
  34. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing реализовано на языке Си алгоритм формализован на языке Promela и верифицирован инструментом SPIN “Using Hardware Transactional Memory to Correct and Simplify and Readers-writer Lock Algorithm”, 2013 20 лет спустя! Обнаружена ошибка в алгоритме, связанная с управлением памятью. Проявлялась на реальной системе. Александр Филатов Concurrency: VM engineer point of view 10 / 46
  35. Как я вижу программистов Идея №2: давай по книжке сделаем!

    KSUH lock “A Fair Fast Scalable Reader-Writer Lock “, 1993 Orran Krieger, Michael Stumm, Ron Unrau, Jonathan Hanna In Proc. of the International Conference on Parallel Processing реализовано на языке Си алгоритм формализован на языке Promela и верифицирован4 инструментом SPIN “Using Hardware Transactional Memory to Correct and Simplify and Readers-writer Lock Algorithm”, 2013 20 лет спустя! Обнаружена ошибка в алгоритме, связанная с управлением памятью. Проявлялась на реальной системе. 4частично Александр Филатов Concurrency: VM engineer point of view 10 / 46
  36. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Выводы Сложные алгоритмы нужны, но приносят с собой: Риски Издержки на поддержку Александр Филатов Concurrency: VM engineer point of view 11 / 46
  37. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Выводы Сложные алгоритмы нужны, но приносят с собой: Риски Издержки на поддержку Реакция VM-инженера: ты точно понимаешь, что написано в книжке и почему оно будет работать? Александр Филатов Concurrency: VM engineer point of view 11 / 46
  38. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Выводы Сложные алгоритмы нужны, но приносят с собой: Риски Издержки на поддержку Реакция VM-инженера: ты точно понимаешь, что написано в книжке и почему оно будет работать? Реакция здорового человека: неудобно, если для редактирования кода требуется кандидатская степень по распределенным системам. Александр Филатов Concurrency: VM engineer point of view 11 / 46
  39. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Выводы Сложные алгоритмы нужны, но приносят с собой: Риски Издержки на поддержку Реакция VM-инженера: ты точно понимаешь, что написано в книжке и почему оно будет работать? Реакция здорового человека: неудобно, если для редактирования кода требуется кандидатская степень по распределенным системам. Александр Филатов Concurrency: VM engineer point of view 11 / 46
  40. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Александр Филатов Concurrency: VM engineer point of view 12 / 46
  41. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Александр Филатов Concurrency: VM engineer point of view 12 / 46
  42. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Александр Филатов Concurrency: VM engineer point of view 12 / 46
  43. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Александр Филатов Concurrency: VM engineer point of view 12 / 46
  44. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Хитрая штука, чтобы ваши synchronized работали очень быстро5. while (0 != count--) { synchronized (jvmLock) { ++counter; } } 5 https://mechanical-sympathy.blogspot.com/2011/11/biased-locking-osr-and-benchmarking-fun.html Александр Филатов Concurrency: VM engineer point of view 12 / 46
  45. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Хитрая штука, чтобы ваши synchronized работали очень быстро5. while (0 != count--) { synchronized (jvmLock) { ++counter; } } 5 https://mechanical-sympathy.blogspot.com/2011/11/biased-locking-osr-and-benchmarking-fun.html Александр Филатов Concurrency: VM engineer point of view 12 / 46
  46. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Опубликован в 2006 году6 6 https://dl.acm.org/doi/10.1145/1167473.1167496 Александр Филатов Concurrency: VM engineer point of view 12 / 46
  47. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Опубликован в 2006 году6 Служил верой и правдой 6 https://dl.acm.org/doi/10.1145/1167473.1167496 Александр Филатов Concurrency: VM engineer point of view 12 / 46
  48. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Опубликован в 2006 году6 Служил верой и правдой "Costly to maintain" 6 https://dl.acm.org/doi/10.1145/1167473.1167496 Александр Филатов Concurrency: VM engineer point of view 12 / 46
  49. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Опубликован в 2006 году6 Служил верой и правдой "Costly to maintain" Deprecated в Java 15 (JEP 374, 2019) 6 https://dl.acm.org/doi/10.1145/1167473.1167496 Александр Филатов Concurrency: VM engineer point of view 12 / 46
  50. Как я вижу программистов Идея №2: давай по книжке сделаем!

    Но если ты эксперт, то тогда можно? Промышленные системы быстры благодаря хитрым решениям. Пример из Java-мира: biased locking. Опубликован в 2006 году6 Служил верой и правдой "Costly to maintain" Deprecated в Java 15 (JEP 374, 2019) 6 https://dl.acm.org/doi/10.1145/1167473.1167496 Александр Филатов Concurrency: VM engineer point of view 12 / 46
  51. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Александр Филатов Concurrency: VM engineer point of view 13 / 46
  52. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Linux futex_wait() bug7 7 https://groups.google.com/g/mechanical-sympathy/c/QbmpZxp6C64/m/BonaHiVbEmsJ Александр Филатов Concurrency: VM engineer point of view 13 / 46
  53. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Linux futex_wait() bug7 Gil Tene (CEO of Azul, co-author of C4 GC): We had this one bite us hard and scare the %$ˆ out of us, so I figured I’d share the fear. 7 https://groups.google.com/g/mechanical-sympathy/c/QbmpZxp6C64/m/BonaHiVbEmsJ Александр Филатов Concurrency: VM engineer point of view 13 / 46
  54. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Linux futex_wait() bug7 Gil Tene (CEO of Azul, co-author of C4 GC): We had this one bite us hard and scare the %$ˆ out of us, so I figured I’d share the fear. The linux futex_wait call has been broken for about a year. 7 https://groups.google.com/g/mechanical-sympathy/c/QbmpZxp6C64/m/BonaHiVbEmsJ Александр Филатов Concurrency: VM engineer point of view 13 / 46
  55. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Linux futex_wait() bug7 Gil Tene (CEO of Azul, co-author of C4 GC): We had this one bite us hard and scare the %$ˆ out of us, so I figured I’d share the fear. The linux futex_wait call has been broken for about a year. The impact of this kernel bug is very simple: user processes can deadlock and hang in seemingly impossible situations. Thread.park() in Java may stay parked. 7 https://groups.google.com/g/mechanical-sympathy/c/QbmpZxp6C64/m/BonaHiVbEmsJ Александр Филатов Concurrency: VM engineer point of view 13 / 46
  56. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Linux futex_wait() bug7 Gil Tene (CEO of Azul, co-author of C4 GC): We had this one bite us hard and scare the %$ˆ out of us, so I figured I’d share the fear. The linux futex_wait call has been broken for about a year. The impact of this kernel bug is very simple: user processes can deadlock and hang in seemingly impossible situations. Thread.park() in Java may stay parked. You’ll spend a couple of months of someone’s time trying to find the fault in your code, when there is nothing there to find. 7 https://groups.google.com/g/mechanical-sympathy/c/QbmpZxp6C64/m/BonaHiVbEmsJ Александр Филатов Concurrency: VM engineer point of view 13 / 46
  57. Как я вижу программистов Идея №3: давай возьмем готовое! Хоть

    кто-то в состоянии написать сложную систему безошибочно? Александр Филатов Concurrency: VM engineer point of view 13 / 46
  58. Как я вижу программистов Идея №3: давай возьмем готовое! Выводы

    Выбирайте проверенные технологии Александр Филатов Concurrency: VM engineer point of view 14 / 46
  59. Как я вижу программистов Идея №3: давай возьмем готовое! Выводы

    Выбирайте проверенные технологии Регулярно обновляйтесь Александр Филатов Concurrency: VM engineer point of view 14 / 46
  60. Как я вижу программистов Идея №3: давай возьмем готовое! Выводы

    Выбирайте проверенные технологии Регулярно обновляйтесь Можете не использовать хитрые алгоритмы – не используйте Александр Филатов Concurrency: VM engineer point of view 14 / 46
  61. Как я вижу программистов Идея №3: давай возьмем готовое! Выводы

    Выбирайте проверенные технологии Регулярно обновляйтесь Можете не использовать хитрые алгоритмы – не используйте Александр Филатов Concurrency: VM engineer point of view 14 / 46
  62. Как я вижу программистов Как страшно жить Жизнерадостный коллега Почему

    так? Александр Филатов Concurrency: VM engineer point of view 15 / 46
  63. Как я вижу программистов Почему так? Личный опыт Человеческий мозг

    не предназначен для многопоточности. Александр Филатов Concurrency: VM engineer point of view 16 / 46
  64. Как я вижу программистов Почему так? Личный опыт Человеческий мозг

    не предназначен для многопоточности. Сложно представлять одновременное исполнение потоков и все возможные пересечения. Александр Филатов Concurrency: VM engineer point of view 16 / 46
  65. Как я вижу программистов Почему так? Личный опыт Человеческий мозг

    не предназначен для многопоточности. Сложно представлять одновременное исполнение потоков и все возможные пересечения. Александр Филатов Concurrency: VM engineer point of view 16 / 46
  66. Как я вижу программистов Неконкретные советы Используйте Простые решения Готовые

    библиотеки для сложных стандартных задач Александр Филатов Concurrency: VM engineer point of view 17 / 46
  67. Как я вижу программистов Неконкретные советы Используйте Простые решения Готовые

    библиотеки для сложных стандартных задач Шаблоны проектирования многопоточных систем Александр Филатов Concurrency: VM engineer point of view 17 / 46
  68. Как я вижу программистов Неконкретные советы Используйте Простые решения Готовые

    библиотеки для сложных стандартных задач Шаблоны проектирования многопоточных систем Предметно-ориентированные языки Александр Филатов Concurrency: VM engineer point of view 17 / 46
  69. Как я вижу программистов Неконкретные советы Используйте Простые решения Готовые

    библиотеки для сложных стандартных задач Шаблоны проектирования многопоточных систем Предметно-ориентированные языки А если меня беспокоит производительность? Александр Филатов Concurrency: VM engineer point of view 17 / 46
  70. Вы находитесь здесь 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов
  71. Как я вижу системных программистов Ленивая инициализация Простой случай public

    class LazyInit { private Object heavyToInitialize = null; /** * Initializes resource lazily, on first getResource . * init should be invoked only once. */ Object getResource() { if (heavyToInitialize == null) { heavyToInitialize = init(); } return heavyToInitialize; } } Александр Филатов Concurrency: VM engineer point of view 18 / 46
  72. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  73. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  74. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  75. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  76. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  77. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  78. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  79. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  80. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  81. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  82. Как я вижу системных программистов Ленивая инициализация Многопоточность private Object

    heavyToInitialize ; // thread 1 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } // thread 2 Object getResource () { if ( heavyToInitialize == null) { heavyToInitialize = init (); } return heavyToInitialize ; } Александр Филатов Concurrency: VM engineer point of view 19 / 46
  83. Как я вижу системных программистов Многопоточная ленивая инициализация Double checked

    locking private volatile Object heavyToInitialize = null; Object getResource() { if (heavyToInitialize == null) { synchronized(this) { if (heavyToInitialize == null) { heavyToInitialize = init(); } } } return heavyToInitialize; } Александр Филатов Concurrency: VM engineer point of view 20 / 46
  84. Как я вижу системных программистов Многопоточная ленивая инициализация Double checked

    locking private volatile Object heavyToInitialize = null; Object getResource() { if (heavyToInitialize == null) { synchronized(this) { if (heavyToInitialize == null) { heavyToInitialize = init(); } } } return heavyToInitialize; } Александр Филатов Concurrency: VM engineer point of view 20 / 46
  85. Как я вижу системных программистов Многопоточная ленивая инициализация Double checked

    locking private volatile Object heavyToInitialize = null; Object getResource() { if (heavyToInitialize == null) { synchronized(this) { if (heavyToInitialize == null) { heavyToInitialize = init(); } } } return heavyToInitialize; } Александр Филатов Concurrency: VM engineer point of view 20 / 46
  86. Как я вижу системных программистов Многопоточная ленивая инициализация А почему

    так медленно? Приходит системный программист. Александр Филатов Concurrency: VM engineer point of view 21 / 46
  87. Как я вижу системных программистов Многопоточная ленивая инициализация А почему

    так медленно? Приходит системный программист. Смотрит на реализацию стандартного шаблона программирования. Александр Филатов Concurrency: VM engineer point of view 21 / 46
  88. Как я вижу системных программистов Многопоточная ленивая инициализация А почему

    так медленно? Приходит системный программист. Смотрит на реализацию стандартного шаблона программирования. Считает, что можно лучше. Александр Филатов Concurrency: VM engineer point of view 21 / 46
  89. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: idea

    void* getResource() { if (heavyToInitialize == NULL) { heavyToInitialize = create(); } return heavyToInitialize; } Александр Филатов Concurrency: VM engineer point of view 22 / 46
  90. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: idea

    void* getResource() { if (heavyToInitialize == NULL) { heavyToInitialize = create(); } return heavyToInitialize; } getResource: mov rax, qword ptr [heavyToInitialize] test rax, rax je .LBB0_1 ret .LBB0_1: ... call create mov qword ptr [heavyToInitialize], rax ... Александр Филатов Concurrency: VM engineer point of view 22 / 46
  91. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: idea

    void* getResource() { if (heavyToInitialize == NULL) { heavyToInitialize = create(); } return heavyToInitialize; } getResource: mov rax, qword ptr [heavyToInitialize] test rax, rax je .LBB0_1 ret .LBB0_1: ... call create mov qword ptr [heavyToInitialize], rax ... Когда инициализация завершилась, не нужно проверять rax на NULL. Александр Филатов Concurrency: VM engineer point of view 22 / 46
  92. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines До

    инициализации: getResource: mov rax, qword ptr [heavyToInitialize] test rax, rax je .LBB0_1 ret .LBB0_1: ... call create mov qword ptr [heavyToInitialize], rax ... Александр Филатов Concurrency: VM engineer point of view 23 / 46
  93. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines Когда

    проинициализировали, требуется замена выделенного участка: getResource: mov rax, qword ptr [heavyToInitialize] test rax, rax ; << je .LBB0_1 ; << ret ; << .LBB0_1: ... call create mov qword ptr [heavyToInitialize], rax ... Александр Филатов Concurrency: VM engineer point of view 23 / 46
  94. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines После

    инициализации: getResource: mov rax, qword ptr [heavyToInitialize] ret ; test rax, rax nop ; je .LBB0_1 nop ; ret .LBB0_1: ... call create mov qword ptr [heavyToInitialize], rax ... Александр Филатов Concurrency: VM engineer point of view 23 / 46
  95. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Александр Филатов Concurrency: VM engineer point of view 24 / 46
  96. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Александр Филатов Concurrency: VM engineer point of view 24 / 46
  97. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  98. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  99. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  100. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring Недостатки: 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  101. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring Недостатки: Security 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  102. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring Недостатки: Security Portability 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  103. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring Недостатки: Security Portability Хакеризм a.k.a. концептуальная сложность 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  104. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring Недостатки: Security Portability Хакеризм a.k.a. концептуальная сложность Data race еще фатальнее 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  105. Как я вижу системных программистов Многопоточная ленивая инициализация Trampolines: use

    cases Очень элегантное и производительное решение. Используется в ядре8: boot-time kernel configuration run-time profiling/monitoring Недостатки: Security Portability Хакеризм a.k.a. концептуальная сложность Data race еще фатальнее Вы так не можете! 8 https://lwn.net/Articles/484687/ Александр Филатов Concurrency: VM engineer point of view 25 / 46
  106. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    idea Фундамент ОС малоподвижен: Ядро уже скомпилировано Александр Филатов Concurrency: VM engineer point of view 26 / 46
  107. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    idea Фундамент ОС малоподвижен: Ядро уже скомпилировано Ему сложно изменять свой код Александр Филатов Concurrency: VM engineer point of view 26 / 46
  108. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    idea Фундамент ОС малоподвижен: Ядро уже скомпилировано Ему сложно изменять свой код Прикладные программы могут быть хитрее: Александр Филатов Concurrency: VM engineer point of view 26 / 46
  109. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    idea Фундамент ОС малоподвижен: Ядро уже скомпилировано Ему сложно изменять свой код Прикладные программы могут быть хитрее: В первый раз функция интерпретируется Александр Филатов Concurrency: VM engineer point of view 26 / 46
  110. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    idea Фундамент ОС малоподвижен: Ядро уже скомпилировано Ему сложно изменять свой код Прикладные программы могут быть хитрее: В первый раз функция интерпретируется Во второй – компилируется Александр Филатов Concurrency: VM engineer point of view 26 / 46
  111. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    idea Фундамент ОС малоподвижен: Ядро уже скомпилировано Ему сложно изменять свой код Прикладные программы могут быть хитрее: В первый раз функция интерпретируется Во второй – компилируется Just-in-time compilation, JIT Александр Филатов Concurrency: VM engineer point of view 26 / 46
  112. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    example Object resource = new Object(); Object[] array = new Object[] { resource }; Object getResource(int index) { if (array == null) throw new NullPointer(); if (index < 0 || index >= array.length) throw new OutOfBounds(); return array[index]; } Александр Филатов Concurrency: VM engineer point of view 27 / 46
  113. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    example Object resource = new Object(); Object[] array = new Object[] { resource }; Object getResource(int index) { if (array == null) throw new NullPointer(); if (index < 0 || index >= array.length) throw new OutOfBounds(); return array[index]; } Допустим, виртуальная машина видит, что в поле array больше ничего не присваивают содержимое array не изменяется Александр Филатов Concurrency: VM engineer point of view 27 / 46
  114. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    example Object resource = new Object(); Object[] array = new Object[] { resource }; Object getResource(int index) { if (array == null) throw new NullPointer(); if (index < 0 || index >= array.length) throw new OutOfBounds(); return array[index]; } Допустим, виртуальная машина видит, что в поле array больше ничего не присваивают содержимое array не изменяется Тогда можно: переместить массив в память по адресу 0x7ffdcaa1c908 сгенерировать специализированный код Александр Филатов Concurrency: VM engineer point of view 27 / 46
  115. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    example Object resource = new Object(); Object[] array = new Object[] { resource }; Object getResource(int index) { if (array == null) throw new NullPointer(); if (index < 0 || index >= array.length) throw new OutOfBounds(); return array[index]; } Object getResource_optimized(int index) { if (address(array) == 0x7ffdcaa1c908) { if (index == 0) { return resource; } } uncommon_trap(); } uncommon_trap – магический метод, который вернет всё, как было . Александр Филатов Concurrency: VM engineer point of view 27 / 46
  116. Как я вижу системных программистов Многопоточная ленивая инициализация Just-In-Time constants:

    example Object resource = new Object(); Object[] array = new Object[] { resource }; Object getResource(int index) { if (array == null) throw new NullPointer(); if (index < 0 || index >= array.length) throw new OutOfBounds(); return array[index]; } Object getResource_optimized(int index) { if (address(array) == 0x7ffdcaa1c908) { if (index == 0) { return resource; } } uncommon_trap(); } uncommon_trap – магический метод, который вернет всё, как было . Александр Филатов Concurrency: VM engineer point of view 27 / 46
  117. Как я вижу системных программистов Многопоточная ленивая инициализация Выводы Используйте

    готовые реализации шаблонов программирования Александр Филатов Concurrency: VM engineer point of view 28 / 46
  118. Как я вижу системных программистов Многопоточная ленивая инициализация Выводы Используйте

    готовые реализации шаблонов программирования Много труда вложено, чтобы они работали верно и быстро Александр Филатов Concurrency: VM engineer point of view 28 / 46
  119. Как я вижу системных программистов Многопоточная ленивая инициализация Выводы Используйте

    готовые реализации шаблонов программирования Много труда вложено, чтобы они работали верно и быстро Узнавайте, какие трюки умеет ваш язык программирования9 9 https://shipilev.net/jvm/anatomy-quarks/ Александр Филатов Concurrency: VM engineer point of view 28 / 46
  120. Как я вижу системных программистов Многопоточная ленивая инициализация Выводы Используйте

    готовые реализации шаблонов программирования Много труда вложено, чтобы они работали верно и быстро Узнавайте, какие трюки умеет ваш язык программирования9 9 https://shipilev.net/jvm/anatomy-quarks/ Александр Филатов Concurrency: VM engineer point of view 28 / 46
  121. Как я вижу системных программистов Многопоточная ленивая инициализация Выводы Используйте

    готовые реализации шаблонов программирования Много труда вложено, чтобы они работали верно и быстро Узнавайте, какие трюки умеет ваш язык программирования9 Кажется, что системные программисты не соблюдают принцип KISS. 9 https://shipilev.net/jvm/anatomy-quarks/ Александр Филатов Concurrency: VM engineer point of view 28 / 46
  122. Вы находитесь здесь 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов
  123. Как я вижу компиляторы Классические оптимизации однопоточного кода Removing reads

    static int a; void foo_1() { while (true) { int tmp = a; if (tmp == 0) break; do_something_with(tmp); } } Александр Филатов Concurrency: VM engineer point of view 29 / 46
  124. Как я вижу компиляторы Классические оптимизации однопоточного кода Removing reads

    static int a; void foo_1() { while (true) { int tmp = a; if (tmp == 0) break; do_something_with(tmp); } } // "optimized" version void foo_2() { int tmp = a; if (tmp != 0) while (true) { do_something_with(tmp); } } Имеет ли право компилятор уменьшить количество загрузок из памяти и переписать функцию? Александр Филатов Concurrency: VM engineer point of view 29 / 46
  125. Как я вижу компиляторы Классические оптимизации однопоточного кода Godbolt static

    int a; void foo_1() { while (true) { int tmp = a; if (tmp == 0) break; do_something_with(tmp); } } Александр Филатов Concurrency: VM engineer point of view 30 / 46
  126. Как я вижу компиляторы Классические оптимизации однопоточного кода Godbolt static

    int a; void foo_1() { while (true) { int tmp = a; if (tmp == 0) break; do_something_with(tmp); } } x86-64 clang 16.0.0 -O210 x86-64 gcc 13.1 -O211 foo_1: push rbx mov ebx, [a] test ebx, ebx je .LBB1_2 .LBB1_1: #<-| mov edi, ebx # | call do_something_with # | jmp .LBB1_1 #--| .LBB1_2: pop rbx ret 10 https://godbolt.org/z/99j3erzaE 11 https://godbolt.org/z/fxzGEo1qf Александр Филатов Concurrency: VM engineer point of view 30 / 46
  127. Как я вижу компиляторы Классические оптимизации однопоточного кода Godbolt static

    int a; void foo_1() { while (true) { int tmp = a; if (tmp == 0) break; do_something_with(tmp); } } x86-64 clang 16.0.0 -O210 x86-64 gcc 13.1 -O211 foo_1: push rbx mov ebx, [a] test ebx, ebx je .LBB1_2 .LBB1_1: #<-| mov edi, ebx # | call do_something_with # | jmp .LBB1_1 #--| .LBB1_2: pop rbx ret 10 https://godbolt.org/z/99j3erzaE 11 https://godbolt.org/z/fxzGEo1qf Александр Филатов Concurrency: VM engineer point of view 30 / 46
  128. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Александр Филатов Concurrency: VM engineer point of view 31 / 46
  129. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Приходится изучать разные решения: Александр Филатов Concurrency: VM engineer point of view 31 / 46
  130. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Приходится изучать разные решения: компиляторные барьеры Александр Филатов Concurrency: VM engineer point of view 31 / 46
  131. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Приходится изучать разные решения: компиляторные барьеры memory orderings (volatile, seq-cst, acquire-release...)12 12 https://snowone.ru/2024/speakers/alantsov Александр Филатов Concurrency: VM engineer point of view 31 / 46
  132. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Приходится изучать разные решения: компиляторные барьеры memory orderings (volatile, seq-cst, acquire-release...)12 примитивы синхронизации и их интеграцию с языком программирования 12 https://snowone.ru/2024/speakers/alantsov Александр Филатов Concurrency: VM engineer point of view 31 / 46
  133. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Приходится изучать разные решения: компиляторные барьеры memory orderings (volatile, seq-cst, acquire-release...)12 примитивы синхронизации и их интеграцию с языком программирования нативные отладчики и time-travel debugging 12 https://snowone.ru/2024/speakers/alantsov Александр Филатов Concurrency: VM engineer point of view 31 / 46
  134. Как я вижу компиляторы Кто виноват и что делать? Очевидные

    преобразования однопоточных программ искажают поведение многопоточного кода. Приходится изучать разные решения: компиляторные барьеры memory orderings (volatile, seq-cst, acquire-release...)12 примитивы синхронизации и их интеграцию с языком программирования нативные отладчики и time-travel debugging узкоспециализированные инструменты (model checking, deterministic scheduling...) 12 https://snowone.ru/2024/speakers/alantsov Александр Филатов Concurrency: VM engineer point of view 31 / 46
  135. Вы находитесь здесь 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов
  136. Как я вижу процессоры Кругом враги Не только компиляторы (software)

    пытаются сломать ваше представление об исполнении программы в многопоточном контексте. Александр Филатов Concurrency: VM engineer point of view 32 / 46
  137. Как я вижу процессоры Кругом враги Не только компиляторы (software)

    пытаются сломать ваше представление об исполнении программы в многопоточном контексте. Есть еще процессор и подсистема памяти (hardware). Александр Филатов Concurrency: VM engineer point of view 32 / 46
  138. Как я вижу процессоры Кругом враги Не только компиляторы (software)

    пытаются сломать ваше представление об исполнении программы в многопоточном контексте. Есть еще процессор и подсистема памяти (hardware). Которые умеют: Александр Филатов Concurrency: VM engineer point of view 32 / 46
  139. Как я вижу процессоры Кругом враги Не только компиляторы (software)

    пытаются сломать ваше представление об исполнении программы в многопоточном контексте. Есть еще процессор и подсистема памяти (hardware). Которые умеют: Исполнять независимые инструкции одновременно (out-of-order execution) Александр Филатов Concurrency: VM engineer point of view 32 / 46
  140. Как я вижу процессоры Кругом враги Не только компиляторы (software)

    пытаются сломать ваше представление об исполнении программы в многопоточном контексте. Есть еще процессор и подсистема памяти (hardware). Которые умеют: Исполнять независимые инструкции одновременно (out-of-order execution) Задействовать одни и те же ресурсы для исполнения логически независимых потоков (hyper-threading) Александр Филатов Concurrency: VM engineer point of view 32 / 46
  141. Как я вижу процессоры Кругом враги Не только компиляторы (software)

    пытаются сломать ваше представление об исполнении программы в многопоточном контексте. Есть еще процессор и подсистема памяти (hardware). Которые умеют: Исполнять независимые инструкции одновременно (out-of-order execution) Задействовать одни и те же ресурсы для исполнения логически независимых потоков (hyper-threading) Спекулировать13,14 О предстоящих переходах (branch prediction) О требуемой памяти (cache prefetching) О результате вычислений (speculative execution) И многом другом 13 https://en.wikipedia.org/wiki/Spectre_(security_vulnerability) 14 https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability) Александр Филатов Concurrency: VM engineer point of view 32 / 46
  142. Как я вижу процессоры x86: Store buffering int x, y;

    void threadA() { x = 1; int a = y; } void threadB() { y = 1; int b = x; } Александр Филатов Concurrency: VM engineer point of view 33 / 46
  143. Как я вижу процессоры x86: Store buffering int x, y;

    void threadA() { x = 1; int a = y; } void threadB() { y = 1; int b = x; } # thread A mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  144. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  145. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? (1 1) , (0 1) , (1 0) , (0 0) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  146. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? (1 1) , (0 1) , (1 0) , (0 0) Варианты исполнения: A.1 -> A.2 -> B.1 -> B.2 B.1 -> A.2 -> B.2 B.2 -> A.2 B.1 -> A.1 -> A.2 -> B.2 B.2 -> A.2 B.2 -> A.1 -> A.2 Александр Филатов Concurrency: VM engineer point of view 33 / 46
  147. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? (1 1) , (0 1) , (1 0) , (0 0) Варианты исполнения: A.1 -> A.2 -> B.1 -> B.2 : (0, 1) B.1 -> A.2 -> B.2 : (1, 1) B.2 -> A.2 : (1, 1) B.1 -> A.1 -> A.2 -> B.2 : (1, 1) B.2 -> A.2 : (1, 1) B.2 -> A.1 -> A.2 : (1, 0) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  148. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? Ответ: (1 1) , (0 1) , (1 0) Варианты исполнения: A.1 -> A.2 -> B.1 -> B.2 : (0, 1) B.1 -> A.2 -> B.2 : (1, 1) B.2 -> A.2 : (1, 1) B.1 -> A.1 -> A.2 -> B.2 : (1, 1) B.2 -> A.2 : (1, 1) B.2 -> A.1 -> A.2 : (1, 0) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  149. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? Ответ: (1 1) , (0 1) , (1 0) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  150. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? Правильный ответ: (1 1) , (0 1) , (1 0) , (0 0) Александр Филатов Concurrency: VM engineer point of view 33 / 46
  151. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? Правильный ответ: (1 1) , (0 1) , (1 0) , (0 0) Процессор иногда переупорядочивает записи и чтения. Александр Филатов Concurrency: VM engineer point of view 33 / 46
  152. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? Правильный ответ: (1 1) , (0 1) , (1 0) , (0 0) Процессор иногда переупорядочивает записи и чтения. Вывод: порядок инструкций в машинном коде = порядок наблюдаемых эффектов этих инструкций. Александр Филатов Concurrency: VM engineer point of view 33 / 46
  153. Как я вижу процессоры x86: Store buffering # thread A

    mov [x] , 1 # (A.1) mov EAX , [y] # (A.2) # thread B mov [y] , 1 # (B.1) mov EBX, [x] # (B.2) Какие значения для (EAX EBX) допустимы? Правильный ответ: (1 1) , (0 1) , (1 0) , (0 0) Процессор иногда переупорядочивает записи и чтения. Вывод: порядок инструкций в машинном коде = порядок наблюдаемых эффектов этих инструкций. Александр Филатов Concurrency: VM engineer point of view 33 / 46
  154. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Александр Филатов Concurrency: VM engineer point of view 34 / 46
  155. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? Александр Филатов Concurrency: VM engineer point of view 34 / 46
  156. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. Александр Филатов Concurrency: VM engineer point of view 34 / 46
  157. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. На x86 или x86_64 (TSO): нет Александр Филатов Concurrency: VM engineer point of view 34 / 46
  158. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. На x86 или x86_64 (TSO): нет На ARM или POWER: да15 15 A Tutorial Introduction to the ARM and POWER Relaxed Memory Models, section 6.1 Александр Филатов Concurrency: VM engineer point of view 34 / 46
  159. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. На x86 или x86_64 (TSO): нет На ARM или POWER: да15 Записи могут "доехать" до других процессоров в разном порядке. 15 A Tutorial Introduction to the ARM and POWER Relaxed Memory Models, section 6.1 Александр Филатов Concurrency: VM engineer point of view 34 / 46
  160. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. На x86 или x86_64 (TSO): нет На ARM или POWER: да15 Записи могут "доехать" до других процессоров в разном порядке. У каждого процессора своя временная шкала и некоторое видение окружающего мира. Возможно, отличающееся от других процессоров. 15 A Tutorial Introduction to the ARM and POWER Relaxed Memory Models, section 6.1 Александр Филатов Concurrency: VM engineer point of view 34 / 46
  161. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. На x86 или x86_64 (TSO): нет На ARM или POWER: да15 Записи могут "доехать" до других процессоров в разном порядке. У каждого процессора своя временная шкала и некоторое видение окружающего мира. Возможно, отличающееся от других процессоров. Вывод: нельзя рассматривать "запись в ячейку памяти" как точку на единой временной шкале16. 15 A Tutorial Introduction to the ARM and POWER Relaxed Memory Models, section 6.1 16 The Art of Multiprocessor Programming by Maurice Herlihy & Nir havit, Chapter 3 "Concurrent Objects" Александр Филатов Concurrency: VM engineer point of view 34 / 46
  162. Как я вижу процессоры arm64: Independent Reads of Independent Writes

    thread1 x = 1 thread2 y = 1 thread3 r1 = x r2 = y thread4 r3 = y r4 = x Может ли быть так, что (r1 = 1, r2 = 0, r3 = 1, r4 = 0)? При условии, что переупорядочивание чтений не происходит. На x86 или x86_64 (TSO): нет На ARM или POWER: да15 Записи могут "доехать" до других процессоров в разном порядке. У каждого процессора своя временная шкала и некоторое видение окружающего мира. Возможно, отличающееся от других процессоров. Вывод: нельзя рассматривать "запись в ячейку памяти" как точку на единой временной шкале16. 15 A Tutorial Introduction to the ARM and POWER Relaxed Memory Models, section 6.1 16 The Art of Multiprocessor Programming by Maurice Herlihy & Nir havit, Chapter 3 "Concurrent Objects" Александр Филатов Concurrency: VM engineer point of view 34 / 46
  163. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций Александр Филатов Concurrency: VM engineer point of view 35 / 46
  164. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале Александр Филатов Concurrency: VM engineer point of view 35 / 46
  165. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале у каждого процессора свои правила Александр Филатов Concurrency: VM engineer point of view 35 / 46
  166. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале у каждого процессора свои правила Александр Филатов Concurrency: VM engineer point of view 35 / 46
  167. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале у каждого процессора свои правила Почему вообще хоть кто-то пользуется ARM/POWER/RISC-V и другими процессорами со слабой моделью памяти? Александр Филатов Concurrency: VM engineer point of view 35 / 46
  168. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале у каждого процессора свои правила Почему вообще хоть кто-то пользуется ARM/POWER/RISC-V и другими процессорами со слабой моделью памяти? производительность Александр Филатов Concurrency: VM engineer point of view 35 / 46
  169. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале у каждого процессора свои правила Почему вообще хоть кто-то пользуется ARM/POWER/RISC-V и другими процессорами со слабой моделью памяти? производительность Производительность! Александр Филатов Concurrency: VM engineer point of view 35 / 46
  170. Как я вижу процессоры Почему так сложно? порядок инструкций в

    машинном коде = порядок наблюдаемых эффектов этих инструкций нельзя рассматривать "чтение/запись в ячейку памяти" как точку на единой временной шкале у каждого процессора свои правила Почему вообще хоть кто-то пользуется ARM/POWER/RISC-V и другими процессорами со слабой моделью памяти? производительность Производительность! энергосбережение :) Александр Филатов Concurrency: VM engineer point of view 35 / 46
  171. Вы находитесь здесь 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов
  172. Как я вижу языки программирования Holy war warning Все языки

    хороши и полезны! Александр Филатов Concurrency: VM engineer point of view 36 / 46
  173. Как я вижу языки программирования Holy war warning Все языки

    хороши и полезны! Просто некоторые вещи в некоторых языках могут мешать при выполнении некоторых задач. Александр Филатов Concurrency: VM engineer point of view 36 / 46
  174. Как я вижу языки программирования Holy war warning Все языки

    хороши и полезны! Просто некоторые вещи в некоторых языках могут мешать при выполнении некоторых задач. Не относитесь серьезно к моим словам. Александр Филатов Concurrency: VM engineer point of view 36 / 46
  175. Как я вижу языки программирования Swift: race to the crash

    Swift17 Concurrent write/write or read/write access to the same location in memory generally remains undefined/illegal behavior, unless all such access is done through a special set of primitive atomic operations. 17 https://github.com/apple/swift-evolution/blob/main/proposals/0282-atomics.md Александр Филатов Concurrency: VM engineer point of view 37 / 46
  176. Как я вижу языки программирования Swift: race to the crash

    Swift17 Concurrent write/write or read/write access to the same location in memory generally remains undefined/illegal behavior, unless all such access is done through a special set of primitive atomic operations. 17 https://github.com/apple/swift-evolution/blob/main/proposals/0282-atomics.md Александр Филатов Concurrency: VM engineer point of view 37 / 46
  177. Как я вижу языки программирования Swift: race to the crash

    Swift17 Concurrent write/write access to the same location remains illegal behavior, unless is done through atomic operations. 17 https://github.com/apple/swift-evolution/blob/main/proposals/0282-atomics.md Александр Филатов Concurrency: VM engineer point of view 37 / 46
  178. Как я вижу языки программирования Swift: race to the crash

    Swift17 Concurrent write/write access to the same location remains illegal behavior, unless is done through atomic operations. import Foundation class Bird {} var S = Bird() let q = DispatchQueue.global(qos: .default) q.async { while(true) { S = Bird() } } while(true) { S = Bird() } 17 https://github.com/apple/swift-evolution/blob/main/proposals/0282-atomics.md Александр Филатов Concurrency: VM engineer point of view 37 / 46
  179. Как я вижу языки программирования Swift: race to the crash

    Swift17 Concurrent write/write access to the same location remains illegal behavior, unless is done through atomic operations. import Foundation class Bird {} var S = Bird() let q = DispatchQueue.global(qos: .default) q.async { while(true) { S = Bird() } } while(true) { S = Bird() } При запуске происходит ошибка double free or corruption. 17 https://github.com/apple/swift-evolution/blob/main/proposals/0282-atomics.md Александр Филатов Concurrency: VM engineer point of view 37 / 46
  180. Как я вижу языки программирования Swift: race to the crash

    Swift17 Concurrent write/write access to the same location remains illegal behavior, unless is done through atomic operations. import Foundation class Bird {} var S = Bird() let q = DispatchQueue.global(qos: .default) q.async { while(true) { S = Bird() } } while(true) { S = Bird() } При запуске происходит ошибка double free or corruption. Почему? Попробуйте догадаться сами18 или подсмотрите в решебник19. 17 https://github.com/apple/swift-evolution/blob/main/proposals/0282-atomics.md 18 https://tonygoold.github.io/arcempire/ 19 https://github.com/apple/swift/blob/main/docs/proposals/Concurrency.rst Александр Филатов Concurrency: VM engineer point of view 37 / 46
  181. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени20. 20 https://en.wikipedia.org/wiki/Consistency_model#Strict_consistency Александр Филатов Concurrency: VM engineer point of view 38 / 46
  182. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. void thread1 () { | void thread2 () { | foo() | baz() | | bar() | foo() | } | } Александр Филатов Concurrency: VM engineer point of view 38 / 46
  183. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. void thread1 () { | void thread2 () { lock () | lock () foo() | baz() unlock () | unlock () lock () | lock () bar() | foo() unlock () | unlock () } | } Александр Филатов Concurrency: VM engineer point of view 38 / 46
  184. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Защищать глобальным мьютексом каждую операцию. static GlobalInterpreterLock GIL = ...; void thread1 () { | void thread2 () { GIL.lock () | GIL.lock () foo() | baz() GIL.unlock () | GIL.unlock () GIL.lock () | GIL.lock () bar() | foo() GIL.unlock () | GIL.unlock () } | } Александр Филатов Concurrency: VM engineer point of view 38 / 46
  185. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Защищать глобальным мьютексом каждую операцию. Александр Филатов Concurrency: VM engineer point of view 38 / 46
  186. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Защищать глобальным мьютексом каждую операцию. Потоки в языке есть21, а их неэффективность является "особенностью" интерпретатора CPython. 21 https://docs.python.org/3/library/threading.html Александр Филатов Concurrency: VM engineer point of view 38 / 46
  187. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Защищать глобальным мьютексом каждую операцию. Потоки в языке есть21, а их неэффективность является "особенностью" интерпретатора CPython. PyPy тоже не собирается отказываться от GIL22. 21 https://docs.python.org/3/library/threading.html 22 https://doc.pypy.org/en/latest/faq.html#does-pypy-have-a-gil-why Александр Филатов Concurrency: VM engineer point of view 38 / 46
  188. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Защищать глобальным мьютексом каждую операцию. Потоки в языке есть21, а их неэффективность является "особенностью" интерпретатора CPython. PyPy тоже не собирается отказываться от GIL22. Попытка переделать модель языка пока не увенчалась успехом23. 21 https://docs.python.org/3/library/threading.html 22 https://doc.pypy.org/en/latest/faq.html#does-pypy-have-a-gil-why 23 https://peps.python.org/pep-0583/ Александр Филатов Concurrency: VM engineer point of view 38 / 46
  189. Как я вижу языки программирования Python: VIP mutex Наиболее интуитивное

    определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Защищать глобальным мьютексом каждую операцию. Потоки в языке есть21, а их неэффективность является "особенностью" интерпретатора CPython. PyPy тоже не собирается отказываться от GIL22. Попытка переделать модель языка пока не увенчалась успехом23. Выбрасыванию GIL мешает нежелание замедлять скриптовый язык еще на 10-30%, ломая интероп с нативными библиотеками24. 21 https://docs.python.org/3/library/threading.html 22 https://doc.pypy.org/en/latest/faq.html#does-pypy-have-a-gil-why 23 https://peps.python.org/pep-0583/ 24 https://peps.python.org/pep-0703/ Александр Филатов Concurrency: VM engineer point of view 38 / 46
  190. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Александр Филатов Concurrency: VM engineer point of view 39 / 46
  191. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Александр Филатов Concurrency: VM engineer point of view 39 / 46
  192. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Единственный поток обрабатывает все события. Событие может породить другие, возможно отложенные, события. Александр Филатов Concurrency: VM engineer point of view 39 / 46
  193. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Единственный поток обрабатывает все события. Событие может породить другие, возможно отложенные, события. Event loop. Александр Филатов Concurrency: VM engineer point of view 39 / 46
  194. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Единственный поток обрабатывает все события. Событие может породить другие, возможно отложенные, события. Event loop. Пользователи любят использовать все ядра своих систем. Александр Филатов Concurrency: VM engineer point of view 39 / 46
  195. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Единственный поток обрабатывает все события. Событие может породить другие, возможно отложенные, события. Event loop. Пользователи любят использовать все ядра своих систем. Можно запускать дополнительных независимых агентов (web workers) и общаться сообщениями25. 25 https://www.w3schools.com/html/html5_webworkers.asp Александр Филатов Concurrency: VM engineer point of view 39 / 46
  196. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Единственный поток обрабатывает все события. Событие может породить другие, возможно отложенные, события. Event loop. Пользователи любят использовать все ядра своих систем. Можно запускать дополнительных независимых агентов (web workers) и общаться сообщениями25. Можно разделять между агентами массивы байтов26. 25 https://www.w3schools.com/html/html5_webworkers.asp 26 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer Александр Филатов Concurrency: VM engineer point of view 39 / 46
  197. Как я вижу языки программирования JavaScript: say no to threading

    Наиболее интуитивное определение для операций с памятью – они все происходят атомарно и их все можно расположить на единой шкале времени. Пусть в языке вообще не будет потоков. Единственный поток обрабатывает все события. Событие может породить другие, возможно отложенные, события. Event loop. Пользователи любят использовать все ядра своих систем. Можно запускать дополнительных независимых агентов (web workers) и общаться сообщениями25. Можно разделять между агентами массивы байтов26. Можно получить data race и думать, что это значит27. 25 https://www.w3schools.com/html/html5_webworkers.asp 26 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer 27 "Repairing and Mechanising the JavaScript Relaxed Memory Model" https://arxiv.org/abs/2005.10554 Александр Филатов Concurrency: VM engineer point of view 39 / 46
  198. Как я вижу языки программирования Java: математично! Используется тяжелая артиллерия:

    An action a is described by a tuple t, k, v, u comprising ... Александр Филатов Concurrency: VM engineer point of view 40 / 46
  199. Как я вижу языки программирования Java: математично! Используется тяжелая артиллерия:

    An action a is described by a tuple t, k, v, u comprising ... Частичные, линейные порядки; транзитивное замыкание бинарных отношений; happens-before Александр Филатов Concurrency: VM engineer point of view 40 / 46
  200. Как я вижу языки программирования Java: математично! Используется тяжелая артиллерия:

    An action a is described by a tuple t, k, v, u comprising ... Частичные, линейные порядки; транзитивное замыкание бинарных отношений; happens-before Causality requirements, circular hp, out-of-thin-air problem Александр Филатов Concurrency: VM engineer point of view 40 / 46
  201. Как я вижу языки программирования Java: математично! Используется тяжелая артиллерия:

    An action a is described by a tuple t, k, v, u comprising ... Частичные, линейные порядки; транзитивное замыкание бинарных отношений; happens-before Causality requirements, circular hp, out-of-thin-air problem Adaptation to h/w models28 28 "JSR-133 Cookbook for Compiler Writers" https://gee.cs.oswego.edu/dl/jmm/cookbook.html Александр Филатов Concurrency: VM engineer point of view 40 / 46
  202. Как я вижу языки программирования Java: математично! Используется тяжелая артиллерия:

    An action a is described by a tuple t, k, v, u comprising ... Частичные, линейные порядки; транзитивное замыкание бинарных отношений; happens-before Causality requirements, circular hp, out-of-thin-air problem Adaptation to h/w models28 Каждый data race имеет разрешенные и запрещенные последствия 28 "JSR-133 Cookbook for Compiler Writers" https://gee.cs.oswego.edu/dl/jmm/cookbook.html Александр Филатов Concurrency: VM engineer point of view 40 / 46
  203. Как я вижу языки программирования Java: математично! Используется тяжелая артиллерия:

    An action a is described by a tuple t, k, v, u comprising ... Частичные, линейные порядки; транзитивное замыкание бинарных отношений; happens-before Causality requirements, circular hp, out-of-thin-air problem Adaptation to h/w models28 Каждый data race имеет разрешенные и запрещенные последствия Подход обладает рядом недостатков: Очень сложно, долго и дорого. Будут недочеты29. Мало кто в мире будет в состоянии полностью понять написанное. Еще меньше людей смогут применить на практике. 28 "JSR-133 Cookbook for Compiler Writers" https://gee.cs.oswego.edu/dl/jmm/cookbook.html 29 "Java Memory Model Examples: Good, Bad and Ugly" https://groups.inf.ed.ac.uk/request/jmmexamples.pdf Александр Филатов Concurrency: VM engineer point of view 40 / 46
  204. Как я вижу языки программирования Use patterns, Luke Doug Lea,

    private communication with Aleksey Shipilev, 201330 The best way to build up a small repertoire of constructions that you know the answers for and then never think about the JMM rules again unless you are forced to do so! Literally nobody likes figuring things out from the JMM rules as stated, or can even routinely do so correctly. This is one of the many reasons we need to overhaul JMM someday. 30 Citation from https://shipilev.net/blog/2014/jmm-pragmatics, slide 109 Александр Филатов Concurrency: VM engineer point of view 41 / 46
  205. Как я вижу языки программирования Многопоточность + Язык программирования =

    ? Существуют языки программирования на любой вкус: Простые и не очень Александр Филатов Concurrency: VM engineer point of view 42 / 46
  206. Как я вижу языки программирования Многопоточность + Язык программирования =

    ? Существуют языки программирования на любой вкус: Простые и не очень Быстрые и не очень Александр Филатов Concurrency: VM engineer point of view 42 / 46
  207. Как я вижу языки программирования Многопоточность + Язык программирования =

    ? Существуют языки программирования на любой вкус: Простые и не очень Быстрые и не очень Многопоточные и не очень Александр Филатов Concurrency: VM engineer point of view 42 / 46
  208. Как я вижу языки программирования Многопоточность + Язык программирования =

    ? Существуют языки программирования на любой вкус: Простые и не очень Быстрые и не очень Многопоточные и не очень Выбирайте подходящий язык для конкретной задачи. Александр Филатов Concurrency: VM engineer point of view 42 / 46
  209. Как я вижу языки программирования Многопоточность + Язык программирования =

    ? Существуют языки программирования на любой вкус: Простые и не очень Быстрые и не очень Многопоточные и не очень Выбирайте подходящий язык для конкретной задачи. Александр Филатов Concurrency: VM engineer point of view 42 / 46
  210. Вы находитесь здесь 1 Знакомство 2 Как я вижу программистов

    3 Как я вижу системных программистов 4 Как я вижу компиляторы 5 Как я вижу процессоры 6 Как я вижу языки программирования 7 Подведение итогов
  211. Подведение итогов Где же научиться писать правильные многопоточные программы? Простых

    способов я не знаю. Александр Филатов Concurrency: VM engineer point of view 43 / 46
  212. Подведение итогов Где же научиться писать правильные многопоточные программы? Простых

    способов я не знаю. Java Concurrency in Practice – 403 страницы The Art of Multiprocessor Programming – 508 страниц Is Parallel Programming Hard, And, If So, What Can You Do About It? – 634 страницы Александр Филатов Concurrency: VM engineer point of view 43 / 46
  213. Подведение итогов Где же научиться писать правильные многопоточные программы? Простых

    способов я не знаю. Java Concurrency in Practice – 403 страницы The Art of Multiprocessor Programming – 508 страниц Is Parallel Programming Hard, And, If So, What Can You Do About It? – 634 страницы Russ Cox, Go programming language tech lead at Google, author of Go memory model:31 Twenty-five years after the first Java memory model, and after many person-centuries of research effort, we may be starting to be able to formalize entire memory models. Perhaps, one day, we will also fully understand them. 31 https://research.swtch.com/plmm Александр Филатов Concurrency: VM engineer point of view 43 / 46
  214. Подведение итогов Заключение Я рассказал вам о своих страхах, привычках

    и предубеждениях о многопоточном программировании. Александр Филатов Concurrency: VM engineer point of view 44 / 46
  215. Подведение итогов Заключение Я рассказал вам о своих страхах, привычках

    и предубеждениях о многопоточном программировании. Гораздо больше осталось за кадром: Сколько интересного скрыто в планировщике задач ОС и его альтернативах Александр Филатов Concurrency: VM engineer point of view 44 / 46
  216. Подведение итогов Заключение Я рассказал вам о своих страхах, привычках

    и предубеждениях о многопоточном программировании. Гораздо больше осталось за кадром: Сколько интересного скрыто в планировщике задач ОС и его альтернативах Об огромных богатствах слабых моделей памяти Александр Филатов Concurrency: VM engineer point of view 44 / 46
  217. Подведение итогов Заключение Я рассказал вам о своих страхах, привычках

    и предубеждениях о многопоточном программировании. Гораздо больше осталось за кадром: Сколько интересного скрыто в планировщике задач ОС и его альтернативах Об огромных богатствах слабых моделей памяти Про фундаментальные алгоритмы и нерешенные проблемы в многопоточности Александр Филатов Concurrency: VM engineer point of view 44 / 46
  218. Подведение итогов Заключение Я рассказал вам о своих страхах, привычках

    и предубеждениях о многопоточном программировании. Гораздо больше осталось за кадром: Сколько интересного скрыто в планировщике задач ОС и его альтернативах Об огромных богатствах слабых моделей памяти Про фундаментальные алгоритмы и нерешенные проблемы в многопоточности Если вам стало интересно – ищите правильных людей. Ходите в университет и на конференции, читайте сложные книги, перенимайте опыт у практикующих разработчиков. Александр Филатов Concurrency: VM engineer point of view 44 / 46
  219. Подведение итогов Заключение Я рассказал вам о своих страхах, привычках

    и предубеждениях о многопоточном программировании. Гораздо больше осталось за кадром: Сколько интересного скрыто в планировщике задач ОС и его альтернативах Об огромных богатствах слабых моделей памяти Про фундаментальные алгоритмы и нерешенные проблемы в многопоточности Если вам стало интересно – ищите правильных людей. Ходите в университет и на конференции, читайте сложные книги, перенимайте опыт у практикующих разработчиков. Помните, с вами говорил не нормальный человек, а VM-инженер. Александр Филатов Concurrency: VM engineer point of view 44 / 46
  220. Подведение итогов Где можно найти приключения Для студентов: стажировка у

    системных программистов. http://rnew.tilda.ws/excelsiorathuawei Для абитуриентов: профиль "Системное программирование" ММФ НГУ. https://education.nsu.ru/syspro/ Александр Филатов Concurrency: VM engineer point of view 45 / 46
  221. Подведение итогов Почитать Книги "The Art of Multiprocessor Programming" by

    M. Herlihy & N. Shavit "Is Parallel Programming Hard, And, If So, What Can You Do About It?" by Paul E. McKenney "Java Concurrency in Practice" by Brian Goetz et al. Статьи "Memory Models" series by Russ Cox32 "Threads Cannot be Implemented as a Library" by Hans-J. Boehm "A Tutorial Introduction to the ARM and POWER Relaxed Memory Models" by L. Maranget et al. "Memory Barriers: a Hardware View for Software Hackers" by Paul E. McKenney 32 https://research.swtch.com/mm Александр Филатов Concurrency: VM engineer point of view 46 / 46
  222. Подведение итогов Посмотреть Роман Елизаров, "Многопоточное программирование теория и практика"

    https://youtu.be/mf4lC6TpclM Алексей Шипилев, JMM series https://shipilev.net Herb Sutter, C++ and Beyond 2012, "Atomic Weapons" series https://youtu.be/A8eCGOqgvH4 Александр Филатов Concurrency: VM engineer point of view 46 / 46