SlideShare a Scribd company logo
Теоретический минимум для
понимания Java Memory Model
© Роман Елизаров, Devexperts, 2014
Закон Мура и “The free lunch is over”
http://www.gotw.ca/publications/concurrency-ddj.htm
Зеленая линия =
Тысяч транзисторов
aka “Закон Мура”
Под ней =
Частота (MHz)
Нужна формальная модель параллельных
вычислений
• Чтобы доказывать:
- корректность алгоритмов
- невозможность построения тех или
иных алгоритмов
- минимально-необходимые требования
для тех или иных алгоритмов
• Для формализации отношений
между прикладным программистом
и разработчиком компилятора и
системы исполнения кода
Модель с общими объектами (общей памятью)
Поток1
Поток2
ПотокN
Общая память
Объект M
Объект 2
Объект 1
Общие объекты
• Потоки выполняют операции над общими, разделяемыми
объектами
• В этой модели не важны операции внутри потоков:
- Вычисления
- Обновления регистров процессора
- Обновления стека потока
- Обновления любой другой локальной для потока памяти
• Важна только коммуникация между потоками
• В этой модели единственный тип коммуникации между
потоками – это работа с общими объектами
Общие переменные
• Общие переменные – это просто простейший тип общего
объекта:
- У него есть значение определенного типа
- Есть операция чтения (read) и записи (write).
• Общие переменные – это базовые строительные блоки для
параллельных алгоритмов
• Модель с общими переменными – это хорошая абстракция
современных многопроцессорных систем и многопоточных ОС
- На практике, это область памяти процесса, которая
одновременно доступна для чтения и записи всем потокам,
исполняемым в данном процессе
В теоретических трудах общие переменные называют регистрами
Свойства параллельных программ
• Последовательные программы детерминированы
- Если нет явного использования случайных чисел и другого
общения с недетерминированным внешним миром
- Их свойства можно установить, анализируя последовательное
исполнение при данных входных параметрах
• Параллельные программы в общем случае
недетерминированы
- Даже если код каждого потока детерминирован
- Результат работы зависит от фактического исполнения при
данных входных параметрах
• А этих исполнений может быть много
- Говорим «программа А имеет свойство 𝑃», если программа A
имеет свойство 𝑃 при любом допустимом исполнении
Моделирование исполнений через
чередование операций
• 𝑆 это общее состояние:
- Состояние всех потоков
- И состояние всех общих объектов
• 𝑓 и 𝑔 это операции над объектами
- Для переменных это операции чтения
(вместе с результатом) и записи
(вместе с значением)
- Количество активных операций равно
количеству потоков
• 𝑓(𝑆) это новое состояние после
применения операции 𝑓 в состоянии 𝑆
𝑔(𝑆)𝑓(𝑆)
𝑆
𝑓 𝑔
Пример
thread P:
0: x = 1
1: print x
2: stop
thread Q:
0: x = 2
1: print x
2: stop
P0,Q0
x=0
(-, -)
P1,Q0
x=1
(-, -)
P0,Q1
x=2
(-, -)
P2,Q0
x=1
(1, -)
P1,Q1
x=2
(-, -)
P1,Q1
x=1
(-, -)
P0,Q2
x=2
(-, 2)
P2,Q2
x=2
(1, 2)
P2,Q2
x=2
(2, 2)
+1 state not shown +2 states not shown
P2,Q2
x=1
(1, 1)
+2 states not shown
P2,Q2
x=1
(2, 1)
+1 state not shown
Всего 17 состояний
shared int x
Обсуждение модели
• Эта модель не «параллельна»
- Все операции происходят последовательно (только порядок
заранее не задан)
• А на самом деле на реальных процессорах операции чтения и
записи памяти не мгновенные и происходит параллельно как
в разных ядрах так и внутри одного ядра
- В реальности процессор обменивается с памятью сообщениями
чтения/записи и таких сообщений находящихся в обработке
одновременно может быть очень много (!)
Модель чередования не отражает фактическую
реальность. Можно ли её использовать для анализа
алгоритмов на практике? Когда её можно использовать?
Физическая реальность (1)
• Свет (электромагнитные волны) в вакууме распространяется
со скоростью ~ 3 ∙ 108
м/c
- Это максимальный физический предел скорости распространения
света. В реальных материалах – медленней.
• За один такт процессора с частотой 3 ГГц (3 ∙ 109
Гц) свет в
вакууме проходит всего 10 см.
- Соседние процессоры на плате физически не могут
синхронизировать свою работу и физически не могут
определить порядок происходящих в них событиях.
- Они работают действительно параллельно.
Физическая реальность (2)
• Пусть 𝑎, 𝑏, 𝑐 ∈ 𝐸 – это физически атомарные (неделимые)
события, происходящие в пространстве-времени
- Говорим «𝑎 предшествует 𝑏» или «𝑎 произошло до 𝑏» (и
записываем 𝑎 → 𝑏), если свет от точки пространства-времени 𝑎
успевает дойти до точки пространства-времени 𝑏
- Это отношение частичного порядка на событиях
x
t
a b
Световой конус
Между 𝑎 и 𝑏 нет предшествования. Они происходят параллельно
с 𝑎 → 𝑐 и 𝑏 → 𝑐
Модель «произошло до»
• Впервые введена Л. Лампортом в 1978 году
• Исполнение системы – это пара (𝐻, → 𝐻)
- 𝐻 – это множество операций 𝑒, 𝑓, 𝑔, … (чтение и запись ячеек
памяти), произошедших во время исполнения
- «→ 𝐻» – это транзитивное, антирефлексивное, асимметричное
отношение (частичный строгий порядок) на множестве операций
- 𝑒 → 𝐻 𝑓 означает что “𝑒 произошло до 𝑓 в исполнении 𝐻”
• Чаще всего исполнение 𝐻 понятно из контекста и опускается
• Две операции 𝑒 и 𝑓 параллельны (𝑒 ∥ 𝑓) если 𝑒 ↛ 𝑓 ⋀ 𝑓 ↛ 𝑒
• Система – это набор всех возможных исполнений системы
- Говорим, что «система имеет свойство 𝑃», если каждое
исполнение системы имеет свойство 𝑃
Модель глобального времени
• В этой модели каждая операция – это временной интервал
𝑒 = 𝑡𝑖𝑛𝑣 𝑒 , 𝑡 𝑟𝑒𝑠𝑝 𝑒 где t 𝑖𝑛𝑣 𝑒 , 𝑡 𝑟𝑒𝑠𝑝(𝑒) ∈ ℝ и
𝑡
P
Q
R
𝑒
𝑓
𝑔
Будем использовать эту модель во всех иллюстрациях
Здесь:
𝑒 → f
𝑒 ∥ 𝑔
𝑓 ∥ 𝑔
𝑒 → 𝑓 ≝ 𝑡 𝑟𝑒𝑠𝑝 𝑒 < 𝑡𝑖𝑛𝑣(𝑓)
Обсуждение глобального времени
• Это всего лишь механизм, позволяющий визуализировать
факт существования параллельных операций
• При доказательстве различных фактов и анализе свойств
[исполнений] системы время не используется
- Анализируются только операции и отношения «произошло до»
На самом деле, никакого глобального
времени нет и не может быть из-за
физических ограничений
Свойства исполнений над общими объектами
http://blog.lib.umn.edu/cspg/electionacademy/images/sharing.jpg
Операции над общими объектами
x.w(1)
объект
операция
аргумент
x.r:1
объект
операция
результат
Запись (write)
общей переменной
Чтение (read)
общей переменной
Последовательное исполнение
• Исполнение системы называется последовательным, если
все операции линейно-упорядочены отношением «произошло
до», то есть ∀𝑒, 𝑓 ∈ 𝐻: 𝑒 = 𝑓 ∨ 𝑒 → 𝑓 ∨ 𝑓 → 𝑒
P
Q
x.w(1)
x.r:1 последовательное
P
Q
x.w(1)
x.r:1 параллельное
Правильное исполнение
• 𝐻 𝑃 – сужение исполнения на поток 𝑃, то есть исполнение, где
остались только операции происходящие в потоке 𝑃
• Исполнение называется правильным (well-formed), если его
сужение на каждый поток 𝑃 является последовательным
историей
P
Q
x.w(1)
x.r: 1 правильное
P
Q
x.w(1)
x.r: 1 неправильное
x.r: 1
x.r: 1
Нас интересуют только правильные исполнения
Последовательная спецификация объекта
• 𝐻 𝑥 – сужение исполнения на объект 𝑥, то есть исполнение,
где остались только операции происходящие над объектом 𝑥
• Если сужение исполнения на объект является
последовательным, то можно проверить его на соответствие
последовательной спецификации объекта
- То, что мы привыкли видеть в обычном мире последовательного
программирования
- Например:
• Чтение переменной должно вернуть последнее записанное
значение.
• Операции deque на объекте FIFO очереди должны
возвращать значения в том порядке, в котором они
передавались в операцию enqueue.
Допустимое последовательное исполнение
• Последовательное исполнение является допустимым (legal),
если выполнены последовательные спецификации всех
объектов
P
Q
x.w(1)
x.r:1
Допустимое
P
Q
x.w(1)
x.r:0
Недопустимое
Условия согласованности (корректности)
• Как определить допустимость параллельного исполнения?
- Сопоставив ему эквивалентное (состоящее из тех же событий и
операций) допустимое последовательное исполнение
- Как именно – тут есть варианты: условия согласованности
• Аналог «корректности» в мире параллельного
программирования
• Условий согласованности много, из них основные
(удовлетворяющие базовому требованию) это:
- Последовательная согласованность
- Линеаризуемость
Базовое требование: корректные
последовательные программы должны
работать корректно в одном потоке
Последовательная согласованность (1)
• Исполнение последовательно согласовано, если можно
сопоставить эквивалентное ему допустимое
последовательное исполнение, которое сохраняет
программный порядок – порядок операций на каждом потоке
P
Q
x.w(1)
x.r:0 Последовательно
согласовано
P
Q
x.w(1)
x.r:2 НЕТ
R
x.r:1
S
x.r:0
x.r:1
Последовательная согласованность (2)
• Используется как условие корректности исполнения всей
системы в целом
- когда нет никакого «внешнего» наблюдателя, который может
«увидеть» фактический порядок между операциями на разных
процессах
• Модель памяти языка программирования и системы
исполнения кода использует последовательную
согласованность
- В том числе, С++11 и Java 5 (JMM = JLS Chapter 17)
Последовательная согласованность не говорит о том, когда
операция физически на самом деле была выполнена
Последовательная согласованность (3)
• Последовательная согласованность на каждом объекте по
отдельности не влечет последовательную согласованность
всего исполнения
P
Q
s.enc(1)
t.enq(2)
t.enc(1)
s.enq(2)
s.deq:2
t.deq:1
ПРИМЕР: (здесь 𝑠 и 𝑡 это две FIFO очереди)
Последовательную согласованность нельзя использовать для
спецификации поведения отдельных объектов в системе
Линеаризуемость
• Исполнение линеаризуемо если можно сопоставить
эквивалентное ему допустимое последовательное
исполнение, которое сохраняет порядок «произошло до»
P
x.w(1)
Последовательно
согласовано,
не линеаризуемо
P
Q
x.w(1)
x.r:0 линеаризуемо
Q
x.r:0
x.r:1
Свойства линеаризуемости
• В линеаризуемом исполнении каждой операции 𝑒 можно
сопоставить некое глобальное время (точку линеаризации)
𝑡 𝑒 ∈ ℝ так, что время разных операций различно и
𝑒 → 𝑓 ⇒ 𝑡 𝑒 < 𝑡(𝑓)
- Это эквивалентное определение линеаризуемости
• Линеаризуемость локальна. Линеаризуемость исполнения на
каждом объекте эквивалентна линеаризуемости исполнения
системы целиком
• Операции над линеаризуемыми объектами называют
атомарными.
- Они происходят как бы мгновенно и в определенном порядке, как
бы в каком-то глобальном времени
Линеаризуемость в глобальном времени
• В глобальном времени исполнение линеаризуемо тогда и
только тогда, когда точки линеаризации могут быть выбраны
так, что
P
Q
x.w(1)
x.r:1
R
x.r:0
линеаризуемо
∀𝑒: 𝑡𝑖𝑛𝑣 𝑒 < 𝑡 𝑒 < 𝑡 𝑟𝑒𝑠𝑝(𝑒)
Исполнение системы, выполняющей операции
над линеаризуемыми (атомарными) объектами,
можно анализировать в модели чередования
Линеаризуемость и чередование
Иерархия линеаризуемых объектов
• Из более простых линеаризуемых объектов можно делать
линеаризуемые объекты более высокого уровня
• Когда говорят что какой-то объект безопасен для
использования из нескольких потоков (thread-safe), то по
умолчанию имеют в виду линеаризуемость операций над ним
Доказав линеаризуемость сложного объекта, можно
абстрагироваться от деталей
реализации в нем, считать операции над ним
атомарными и строить объекты более высокого уровня
Применительно к Java
• Все операции над volatile полями в Java, согласно JMM,
являются операциями синхронизации (17.4.2), которые
всегда линейно-упорядочены в любом исполнении (17.4.4)
- А значит являются линеаризуемыми
• Но операции над не volatile полями воистину могут нарушать
не только линеаризуемость, но и последовательную
согласованность (в отсутствии синхронизации)
P
Q
x.w(1)
x.r:1 допустимо в JMMx.r:0 x.r:1
Рекомендованная литература
В своем блоге elizarov.livejournal.com я размещу ссылки
на научные работы для дополнительного чтения по теме
Спасибо за внимание
Слайды также будут выложены на elizarov.livejournal.com
Ad

More Related Content

Similar to Теоретический минимум для понимания Java Memory Model (для JPoint 2014) (20)

ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисленияПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
Alexey Paznikov
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
Technopark
 
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Mikhail Kurnosov
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Yandex
 
Java Memory Model. Quick introduction.
Java Memory Model. Quick introduction.Java Memory Model. Quick introduction.
Java Memory Model. Quick introduction.
Yury Kisliak
 
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Positive Hack Days
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
Technopark
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?
corehard_by
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
Alexey Paznikov
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla Systems Inc.
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
Andrii Rodionov
 
Lab5
Lab5Lab5
Lab5
ssuser568529
 
PowerShell
PowerShellPowerShell
PowerShell
GetDev.NET
 
лекция 2
лекция 2лекция 2
лекция 2
Надежда Бровко
 
Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?
OpenVZ
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программирование
Yandex
 
2020 03-31-lection
2020 03-31-lection2020 03-31-lection
2020 03-31-lection
Olga Leshchenko
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
Yauheni Akhotnikau
 
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисленияПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
ПВТ - осень 2014 - лекция 1 - Введение в параллельные вычисления
Alexey Paznikov
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
Technopark
 
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POS...
Mikhail Kurnosov
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Yandex
 
Java Memory Model. Quick introduction.
Java Memory Model. Quick introduction.Java Memory Model. Quick introduction.
Java Memory Model. Quick introduction.
Yury Kisliak
 
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Positive Hack Days
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
Technopark
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?
corehard_by
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
Alexey Paznikov
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla Systems Inc.
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
Andrii Rodionov
 
Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?Checkpoint and Restore In Userspace: Готово или нет?
Checkpoint and Restore In Userspace: Готово или нет?
OpenVZ
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программирование
Yandex
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
Yauheni Akhotnikau
 

More from Roman Elizarov (20)

Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018
Roman Elizarov
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
Roman Elizarov
 
Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017
Roman Elizarov
 
Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017
Roman Elizarov
 
Scale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOneScale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOne
Roman Elizarov
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines Reloaded
Roman Elizarov
 
Lock-free algorithms for Kotlin Coroutines
Lock-free algorithms for Kotlin CoroutinesLock-free algorithms for Kotlin Coroutines
Lock-free algorithms for Kotlin Coroutines
Roman Elizarov
 
Introduction to Kotlin coroutines
Introduction to Kotlin coroutinesIntroduction to Kotlin coroutines
Introduction to Kotlin coroutines
Roman Elizarov
 
Non blocking programming and waiting
Non blocking programming and waitingNon blocking programming and waiting
Non blocking programming and waiting
Roman Elizarov
 
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
Why GC is eating all my CPU?
Why GC is eating all my CPU?Why GC is eating all my CPU?
Why GC is eating all my CPU?
Roman Elizarov
 
DIY Java Profiling
DIY Java ProfilingDIY Java Profiling
DIY Java Profiling
Roman Elizarov
 
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
Java Serialization Facts and Fallacies
Java Serialization Facts and FallaciesJava Serialization Facts and Fallacies
Java Serialization Facts and Fallacies
Roman Elizarov
 
Millions quotes per second in pure java
Millions quotes per second in pure javaMillions quotes per second in pure java
Millions quotes per second in pure java
Roman Elizarov
 
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
The theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmerThe theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmer
Roman Elizarov
 
Пишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данныхПишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данных
Roman Elizarov
 
Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018
Roman Elizarov
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
Roman Elizarov
 
Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017
Roman Elizarov
 
Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017
Roman Elizarov
 
Scale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOneScale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOne
Roman Elizarov
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines Reloaded
Roman Elizarov
 
Lock-free algorithms for Kotlin Coroutines
Lock-free algorithms for Kotlin CoroutinesLock-free algorithms for Kotlin Coroutines
Lock-free algorithms for Kotlin Coroutines
Roman Elizarov
 
Introduction to Kotlin coroutines
Introduction to Kotlin coroutinesIntroduction to Kotlin coroutines
Introduction to Kotlin coroutines
Roman Elizarov
 
Non blocking programming and waiting
Non blocking programming and waitingNon blocking programming and waiting
Non blocking programming and waiting
Roman Elizarov
 
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
Why GC is eating all my CPU?
Why GC is eating all my CPU?Why GC is eating all my CPU?
Why GC is eating all my CPU?
Roman Elizarov
 
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
Java Serialization Facts and Fallacies
Java Serialization Facts and FallaciesJava Serialization Facts and Fallacies
Java Serialization Facts and Fallacies
Roman Elizarov
 
Millions quotes per second in pure java
Millions quotes per second in pure javaMillions quotes per second in pure java
Millions quotes per second in pure java
Roman Elizarov
 
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 
The theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmerThe theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmer
Roman Elizarov
 
Пишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данныхПишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данных
Roman Elizarov
 
Ad

Теоретический минимум для понимания Java Memory Model (для JPoint 2014)

  • 1. Теоретический минимум для понимания Java Memory Model © Роман Елизаров, Devexperts, 2014
  • 2. Закон Мура и “The free lunch is over” http://www.gotw.ca/publications/concurrency-ddj.htm Зеленая линия = Тысяч транзисторов aka “Закон Мура” Под ней = Частота (MHz)
  • 3. Нужна формальная модель параллельных вычислений • Чтобы доказывать: - корректность алгоритмов - невозможность построения тех или иных алгоритмов - минимально-необходимые требования для тех или иных алгоритмов • Для формализации отношений между прикладным программистом и разработчиком компилятора и системы исполнения кода
  • 4. Модель с общими объектами (общей памятью) Поток1 Поток2 ПотокN Общая память Объект M Объект 2 Объект 1
  • 5. Общие объекты • Потоки выполняют операции над общими, разделяемыми объектами • В этой модели не важны операции внутри потоков: - Вычисления - Обновления регистров процессора - Обновления стека потока - Обновления любой другой локальной для потока памяти • Важна только коммуникация между потоками • В этой модели единственный тип коммуникации между потоками – это работа с общими объектами
  • 6. Общие переменные • Общие переменные – это просто простейший тип общего объекта: - У него есть значение определенного типа - Есть операция чтения (read) и записи (write). • Общие переменные – это базовые строительные блоки для параллельных алгоритмов • Модель с общими переменными – это хорошая абстракция современных многопроцессорных систем и многопоточных ОС - На практике, это область памяти процесса, которая одновременно доступна для чтения и записи всем потокам, исполняемым в данном процессе В теоретических трудах общие переменные называют регистрами
  • 7. Свойства параллельных программ • Последовательные программы детерминированы - Если нет явного использования случайных чисел и другого общения с недетерминированным внешним миром - Их свойства можно установить, анализируя последовательное исполнение при данных входных параметрах • Параллельные программы в общем случае недетерминированы - Даже если код каждого потока детерминирован - Результат работы зависит от фактического исполнения при данных входных параметрах • А этих исполнений может быть много - Говорим «программа А имеет свойство 𝑃», если программа A имеет свойство 𝑃 при любом допустимом исполнении
  • 8. Моделирование исполнений через чередование операций • 𝑆 это общее состояние: - Состояние всех потоков - И состояние всех общих объектов • 𝑓 и 𝑔 это операции над объектами - Для переменных это операции чтения (вместе с результатом) и записи (вместе с значением) - Количество активных операций равно количеству потоков • 𝑓(𝑆) это новое состояние после применения операции 𝑓 в состоянии 𝑆 𝑔(𝑆)𝑓(𝑆) 𝑆 𝑓 𝑔
  • 9. Пример thread P: 0: x = 1 1: print x 2: stop thread Q: 0: x = 2 1: print x 2: stop P0,Q0 x=0 (-, -) P1,Q0 x=1 (-, -) P0,Q1 x=2 (-, -) P2,Q0 x=1 (1, -) P1,Q1 x=2 (-, -) P1,Q1 x=1 (-, -) P0,Q2 x=2 (-, 2) P2,Q2 x=2 (1, 2) P2,Q2 x=2 (2, 2) +1 state not shown +2 states not shown P2,Q2 x=1 (1, 1) +2 states not shown P2,Q2 x=1 (2, 1) +1 state not shown Всего 17 состояний shared int x
  • 10. Обсуждение модели • Эта модель не «параллельна» - Все операции происходят последовательно (только порядок заранее не задан) • А на самом деле на реальных процессорах операции чтения и записи памяти не мгновенные и происходит параллельно как в разных ядрах так и внутри одного ядра - В реальности процессор обменивается с памятью сообщениями чтения/записи и таких сообщений находящихся в обработке одновременно может быть очень много (!) Модель чередования не отражает фактическую реальность. Можно ли её использовать для анализа алгоритмов на практике? Когда её можно использовать?
  • 11. Физическая реальность (1) • Свет (электромагнитные волны) в вакууме распространяется со скоростью ~ 3 ∙ 108 м/c - Это максимальный физический предел скорости распространения света. В реальных материалах – медленней. • За один такт процессора с частотой 3 ГГц (3 ∙ 109 Гц) свет в вакууме проходит всего 10 см. - Соседние процессоры на плате физически не могут синхронизировать свою работу и физически не могут определить порядок происходящих в них событиях. - Они работают действительно параллельно.
  • 12. Физическая реальность (2) • Пусть 𝑎, 𝑏, 𝑐 ∈ 𝐸 – это физически атомарные (неделимые) события, происходящие в пространстве-времени - Говорим «𝑎 предшествует 𝑏» или «𝑎 произошло до 𝑏» (и записываем 𝑎 → 𝑏), если свет от точки пространства-времени 𝑎 успевает дойти до точки пространства-времени 𝑏 - Это отношение частичного порядка на событиях x t a b Световой конус Между 𝑎 и 𝑏 нет предшествования. Они происходят параллельно с 𝑎 → 𝑐 и 𝑏 → 𝑐
  • 13. Модель «произошло до» • Впервые введена Л. Лампортом в 1978 году • Исполнение системы – это пара (𝐻, → 𝐻) - 𝐻 – это множество операций 𝑒, 𝑓, 𝑔, … (чтение и запись ячеек памяти), произошедших во время исполнения - «→ 𝐻» – это транзитивное, антирефлексивное, асимметричное отношение (частичный строгий порядок) на множестве операций - 𝑒 → 𝐻 𝑓 означает что “𝑒 произошло до 𝑓 в исполнении 𝐻” • Чаще всего исполнение 𝐻 понятно из контекста и опускается • Две операции 𝑒 и 𝑓 параллельны (𝑒 ∥ 𝑓) если 𝑒 ↛ 𝑓 ⋀ 𝑓 ↛ 𝑒 • Система – это набор всех возможных исполнений системы - Говорим, что «система имеет свойство 𝑃», если каждое исполнение системы имеет свойство 𝑃
  • 14. Модель глобального времени • В этой модели каждая операция – это временной интервал 𝑒 = 𝑡𝑖𝑛𝑣 𝑒 , 𝑡 𝑟𝑒𝑠𝑝 𝑒 где t 𝑖𝑛𝑣 𝑒 , 𝑡 𝑟𝑒𝑠𝑝(𝑒) ∈ ℝ и 𝑡 P Q R 𝑒 𝑓 𝑔 Будем использовать эту модель во всех иллюстрациях Здесь: 𝑒 → f 𝑒 ∥ 𝑔 𝑓 ∥ 𝑔 𝑒 → 𝑓 ≝ 𝑡 𝑟𝑒𝑠𝑝 𝑒 < 𝑡𝑖𝑛𝑣(𝑓)
  • 15. Обсуждение глобального времени • Это всего лишь механизм, позволяющий визуализировать факт существования параллельных операций • При доказательстве различных фактов и анализе свойств [исполнений] системы время не используется - Анализируются только операции и отношения «произошло до» На самом деле, никакого глобального времени нет и не может быть из-за физических ограничений
  • 16. Свойства исполнений над общими объектами http://blog.lib.umn.edu/cspg/electionacademy/images/sharing.jpg
  • 17. Операции над общими объектами x.w(1) объект операция аргумент x.r:1 объект операция результат Запись (write) общей переменной Чтение (read) общей переменной
  • 18. Последовательное исполнение • Исполнение системы называется последовательным, если все операции линейно-упорядочены отношением «произошло до», то есть ∀𝑒, 𝑓 ∈ 𝐻: 𝑒 = 𝑓 ∨ 𝑒 → 𝑓 ∨ 𝑓 → 𝑒 P Q x.w(1) x.r:1 последовательное P Q x.w(1) x.r:1 параллельное
  • 19. Правильное исполнение • 𝐻 𝑃 – сужение исполнения на поток 𝑃, то есть исполнение, где остались только операции происходящие в потоке 𝑃 • Исполнение называется правильным (well-formed), если его сужение на каждый поток 𝑃 является последовательным историей P Q x.w(1) x.r: 1 правильное P Q x.w(1) x.r: 1 неправильное x.r: 1 x.r: 1 Нас интересуют только правильные исполнения
  • 20. Последовательная спецификация объекта • 𝐻 𝑥 – сужение исполнения на объект 𝑥, то есть исполнение, где остались только операции происходящие над объектом 𝑥 • Если сужение исполнения на объект является последовательным, то можно проверить его на соответствие последовательной спецификации объекта - То, что мы привыкли видеть в обычном мире последовательного программирования - Например: • Чтение переменной должно вернуть последнее записанное значение. • Операции deque на объекте FIFO очереди должны возвращать значения в том порядке, в котором они передавались в операцию enqueue.
  • 21. Допустимое последовательное исполнение • Последовательное исполнение является допустимым (legal), если выполнены последовательные спецификации всех объектов P Q x.w(1) x.r:1 Допустимое P Q x.w(1) x.r:0 Недопустимое
  • 22. Условия согласованности (корректности) • Как определить допустимость параллельного исполнения? - Сопоставив ему эквивалентное (состоящее из тех же событий и операций) допустимое последовательное исполнение - Как именно – тут есть варианты: условия согласованности • Аналог «корректности» в мире параллельного программирования • Условий согласованности много, из них основные (удовлетворяющие базовому требованию) это: - Последовательная согласованность - Линеаризуемость Базовое требование: корректные последовательные программы должны работать корректно в одном потоке
  • 23. Последовательная согласованность (1) • Исполнение последовательно согласовано, если можно сопоставить эквивалентное ему допустимое последовательное исполнение, которое сохраняет программный порядок – порядок операций на каждом потоке P Q x.w(1) x.r:0 Последовательно согласовано P Q x.w(1) x.r:2 НЕТ R x.r:1 S x.r:0 x.r:1
  • 24. Последовательная согласованность (2) • Используется как условие корректности исполнения всей системы в целом - когда нет никакого «внешнего» наблюдателя, который может «увидеть» фактический порядок между операциями на разных процессах • Модель памяти языка программирования и системы исполнения кода использует последовательную согласованность - В том числе, С++11 и Java 5 (JMM = JLS Chapter 17) Последовательная согласованность не говорит о том, когда операция физически на самом деле была выполнена
  • 25. Последовательная согласованность (3) • Последовательная согласованность на каждом объекте по отдельности не влечет последовательную согласованность всего исполнения P Q s.enc(1) t.enq(2) t.enc(1) s.enq(2) s.deq:2 t.deq:1 ПРИМЕР: (здесь 𝑠 и 𝑡 это две FIFO очереди) Последовательную согласованность нельзя использовать для спецификации поведения отдельных объектов в системе
  • 26. Линеаризуемость • Исполнение линеаризуемо если можно сопоставить эквивалентное ему допустимое последовательное исполнение, которое сохраняет порядок «произошло до» P x.w(1) Последовательно согласовано, не линеаризуемо P Q x.w(1) x.r:0 линеаризуемо Q x.r:0 x.r:1
  • 27. Свойства линеаризуемости • В линеаризуемом исполнении каждой операции 𝑒 можно сопоставить некое глобальное время (точку линеаризации) 𝑡 𝑒 ∈ ℝ так, что время разных операций различно и 𝑒 → 𝑓 ⇒ 𝑡 𝑒 < 𝑡(𝑓) - Это эквивалентное определение линеаризуемости • Линеаризуемость локальна. Линеаризуемость исполнения на каждом объекте эквивалентна линеаризуемости исполнения системы целиком • Операции над линеаризуемыми объектами называют атомарными. - Они происходят как бы мгновенно и в определенном порядке, как бы в каком-то глобальном времени
  • 28. Линеаризуемость в глобальном времени • В глобальном времени исполнение линеаризуемо тогда и только тогда, когда точки линеаризации могут быть выбраны так, что P Q x.w(1) x.r:1 R x.r:0 линеаризуемо ∀𝑒: 𝑡𝑖𝑛𝑣 𝑒 < 𝑡 𝑒 < 𝑡 𝑟𝑒𝑠𝑝(𝑒)
  • 29. Исполнение системы, выполняющей операции над линеаризуемыми (атомарными) объектами, можно анализировать в модели чередования Линеаризуемость и чередование
  • 30. Иерархия линеаризуемых объектов • Из более простых линеаризуемых объектов можно делать линеаризуемые объекты более высокого уровня • Когда говорят что какой-то объект безопасен для использования из нескольких потоков (thread-safe), то по умолчанию имеют в виду линеаризуемость операций над ним Доказав линеаризуемость сложного объекта, можно абстрагироваться от деталей реализации в нем, считать операции над ним атомарными и строить объекты более высокого уровня
  • 31. Применительно к Java • Все операции над volatile полями в Java, согласно JMM, являются операциями синхронизации (17.4.2), которые всегда линейно-упорядочены в любом исполнении (17.4.4) - А значит являются линеаризуемыми • Но операции над не volatile полями воистину могут нарушать не только линеаризуемость, но и последовательную согласованность (в отсутствии синхронизации) P Q x.w(1) x.r:1 допустимо в JMMx.r:0 x.r:1
  • 32. Рекомендованная литература В своем блоге elizarov.livejournal.com я размещу ссылки на научные работы для дополнительного чтения по теме
  • 33. Спасибо за внимание Слайды также будут выложены на elizarov.livejournal.com
  翻译: