SlideShare a Scribd company logo
1 of 55
Download to read offline
Атомики, CAS и
неблокирующие
алгоритмы
Алексей Федоров, ОК
@23derevo
@23derevo
—  Oracle — 2011–2014
—  Java Compatibility Kit (JCK)
—  OK.ru — since 2014 — Technology Evangelist
—  JUG.ru Group
—  JUG.ru & CodeFreeze — since 2012
—  JPoint & Joker — since 2013
—  Mobius & .NEXT — since 2014
2
3
О чем этот доклад
4
О чем этот доклад
5
Модели
—  Модель с разделяемой памятью
—  Регистры
— Операции: read, write
—  Удобно программировать, все привыкли
—  Модель с передачей сообщений
—  Послать сообщение
—  Похожа на то, как реально работает железо
6
Терминология
—  Нет устоявшейся терминологии
—  Термины:
—  Parallel
—  Concurrent
—  Distributed
7
Виды параллелизма
—  На уровне операционной системы
—  На уровне одной программы / процесса
8
Параллелизм — ОС
—  Слушать музыку и переписываться
в фейсбуке в Одноклассниках
—  При зависании одной программы другие
продолжают работать
—  и т.п.
9
Преимущества параллелизма
—  Использование нескольких ядер/процессоров
—  Да и на 1 ядре тоже! (async I/O)
—  Простота моделирования
—  Абстракция: фреймворк забирает сложность
—  Упрощенная обработка асинхронных событий
—  Более отзывчивые интерфейсы пользователя
—  Event Dispatch Thread (EDT), async calls
10
Параллелизм на уровне
отдельно взятой программы
—  Эффективное использование ресурсов
—  Удобство, простота написания кода
—  Справедливость
—  Обработка запросов пользователей на
серверах соцсети с одинаковым приоритетом
—  Читатели и писатели
— Fairness (честность)
11
Честность
12
Честность
13
Lock lock = new ReentrantLock(true);
Честность
14
Lock lock = new ReentrantLock(true);
Честность
15
Блокировки
—  java.util.concurrent — since Java 5
—  Lock —> ReentrantLock
—  ReadWriteLock —> ReentrantReadWriteLock
—  StampedLock — since Java 8
—  Synchronized method / section
—  wait() / notify() / notifyAll()
16
Блокировки
—  java.util.concurrent
—  Lock —> ReentrantLock
—  ReadWriteLock —> ReentrantReadWriteLock
—  Syncronized method / section
—  wait() / notify() / notifyAll()
17
Общее: ожидание
Проблемы блокировок
—  Взаимоблокировки (Deadlocks)
—  Инверсия приоритетов
—  Надежность — вдруг владелец блокировки
помрет?
—  Performance
—  Параллелизма в критической секции нет!
—  Владелец блокировки может быть вытеснен
планировщиком
18
Закон Амдала
—  α — часть общего объема вычислений,
которую нельзя распараллелить
—  1-α — часть, которую можно распараллелить
—  p — количество потоков
19
Закон Амдала
—  α — часть общего объема вычислений,
которую нельзя распараллелить
—  1-α — часть, которую можно распараллелить
—  p — количество потоков
20
Алгоритмы без блокировок
—  Без препятствий (Obstruction-Free) —
Поток совершает прогресс, если не встречает
препятствий со стороны других потоков
—  Без блокировок (Lock-Free) — гарантируется
системный прогресс хотя бы одного потока
—  Без ожидания (Wait-Free) — каждая операция
выполняется за фиксированное число шагов,
не зависящее от других потоков
21
Консенсус
—  Объект consensus с операцией decide(v):
—  consensus.decide(v) ≠ const
—  Wait-free
—  N Потоков вызывают consensus.decide()
—  i-ый поток вызывает consensus.decide(vi)
—  Каждый поток вызывает не более 1 раза
—  decide() возвращает одно из vi
—  decide() — протокол консенсуса
22
Консенсусное число
—  Мощность консенсуса — максимальное
количество (N) потоков, для которых данный
объект обеспечивает консенсус
—  Консенсусное число примитива синхронизации
— максимальная мощность консенсуса, который
можно построить на базе данного примитива и
некоторого количества атомарных регистров
—  То есть, существует реализация метода
decide для N потоков, использующая данный
примитив как строительный блок
23
Консенсусное число
—  Операции на регистрах — 1
—  Read-Modification-Write (RMW) — 2
—  Common2 Class — коммутируют друг с
другом или перезаписывают друг друга
—  Универсальные операции — ∞
— Сравнение с обменом (CAS):
Compare-And-Swap, Compare-And-Set
24
Compare and Swap
—  Compare-and-swap (CAS)
—  IA32, x64
—  SPARC
—  loadlinked + store-conditional (LL/SC)
—  PowerPC
—  ARM
25
Семантика CAS
26
Типичный паттерн применения
1. Прочитать значение A из переменной V
2. Взять какое-то новое значение B для V
3. Использовать CAS для атомарного изменения V
из A в B до тех пор, пока другие потоки
меняют значение V во время этого процесса
Атомарность Read-Modify-Write реализуется за
счет постоянного мониторинга системы на
предмет постороннего вмешательства
27
Алгоритм 1: неблокирующий счетчик
28
Fast path vs. long path
—  Каждый блок кода может иметь, как минимум,
два пути исполнения: короткий и длинный
—  Lock: contended vs. Uncontended
—  Uncontended Lock:
—  ≥ 1 CAS
—  Другая машинерия вокруг lock
29
Недостатки CAS
—  CAS заставляет потоки, которые его вызывают,
работать в условиях соревнования
(contention)
—  Больше contention = больше бесполезных циклов
процессора, трата процессорного времени
—  Написание корректных и быстрых алгоритмов на
CAS требует специальной подготовки
30
Поддержка CAS в JVM
—  В Java 5 появился JSR166
—  пакет java.util.concurrent
—  пакет java.util.concurrent.atomic
—  На платформах, поддерживающих CAS, JIT-
компилятор делает inline соответствующих
машинных инструкций
—  Load Linked / Store Conditional
—  Интерпретатор использует Spin Lock
31
Atomic variable classes
—  Scalars
—  Field updaters
—  Arrays
—  Compound variables
—  Accumulators
—  since Java 8
32
Scalars
—  AtomicBoolean
—  AtomicInteger
—  AtomicLong
—  AtomicReference
33
AtomicInteger
—  boolean compareAndSet(int expect, int update)
—  int addAndGet(int delta)
—  int getAndDecrement()
—  int getAndIncrement()
—  int incrementAndGet()
—  …
34
Multivariable Invariant
35
Multivariable Invariant
36
Field Updaters
—  AtomicIntegerFieldUpdater
—  Reflection-based updater for volatile int
—  AtomicLongFieldUpdater
—  Reflection-based updater for volatile long
—  AtomicReferenceFieldUpdater
—  Reflection-based updater for object
37
AtomicLongFieldUpdater
—  long addAndGet(T obj, long delta)
—  boolean compareAndSet(T obj, long expect,
long update)
—  long getAndAdd(T obj, long delta)
—  long incrementAndGet(T obj)
38
AtomicLongFieldUpdater
39
AtomicLongFieldUpdater
40
Atomic Arrays
—  AtomicIntegerArray
—  AtomicLongArray
—  AtomicReferenceArray
41
AtomicLongArray
—  long addAndGet(int i, long delta)
—  long getAndAdd(int i, long delta)
—  boolean compareAndSet(int i, long expect,
long update)
—  long incrementAndGet(int i)
—  …
42
Compound Variables
—  AtomicMarkableReference
—  compareAndSet(
V expectedReference, V newReference,
boolean expectedMark, boolean newMark)
—  AtomicStampedReference
—  boolean compareAndSet(
V expectedReference, V newReference,
int expectedStamp, int newStamp)
43
Accumulators
—  DoubleAccumulator
—  DoubleAdder
—  LongAccumulator
—  LongAdder
—  (Striped64)
44
LongAccumulator
—  void accumulate(long x)
—  long get()
—  long getThenReset()
—  Void reset()
45
Неблокирующие алгоритмы
—  Алгоритм называется неблокирующим, если
отказ или остановка любого потока не может
привести к отказу или остановке любого
другого потока
—  Алгоритм называется свободным от блокировок,
если на каждом шаге какой-то поток выполняет
работу (make progress)
—  Аглоритмы на CAS могут быть одновременно
неблокирующими и свободными от блокировок
46
Неблокирующий стек
47
Неблокирующий стек
48
Неблокирующий стек — push
49
Неблокирующий стек — pop
50
Неблокирующая очередь
—  Michael and Scott, 1996
—  Алгоритм неочевидный
—  Потоки помогают друг другу
51
52
Проблема ABA
53
Литература
—  java.util.concurrent.atomic — Java 8 doc
http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html
—  Brian Goetz,Java Concurrency in Practice
http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601
—  Herlihy, Shavit
The Art of Multiprocessor Programming
http://www.amazon.com/The-Multiprocessor-Programming-Revised-Reprint/dp/0123973376
—  Nitsan Wakart, Degrees of (Lock/Wait) Freedom
http://psy-lob-saw.blogspot.com/2015/05/degrees-of-lockwait-freedom.html
—  OpenJDK sources
54
Questions & Answers
55

More Related Content

What's hot

Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Nedospasov defcon russia 23
Nedospasov defcon russia 23Nedospasov defcon russia 23
Nedospasov defcon russia 23DefconRussia
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaAndrei Pangin
 

What's hot (20)

Java 8. Thread pools
Java 8. Thread poolsJava 8. Thread pools
Java 8. Thread pools
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Thread
ThreadThread
Thread
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Java threads - part 1
Java threads - part 1Java threads - part 1
Java threads - part 1
 
Java threads - part 3
Java threads - part 3Java threads - part 3
Java threads - part 3
 
Java threads - part 2
Java threads - part 2Java threads - part 2
Java threads - part 2
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Nedospasov defcon russia 23
Nedospasov defcon russia 23Nedospasov defcon russia 23
Nedospasov defcon russia 23
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Cloud Haskell. Александр Вершилов
Cloud Haskell. Александр ВершиловCloud Haskell. Александр Вершилов
Cloud Haskell. Александр Вершилов
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in Java
 

Viewers also liked

Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Alexey Fyodorov
 
CompletableFuture уже здесь
CompletableFuture уже здесьCompletableFuture уже здесь
CompletableFuture уже здесьDmitry Chuyko
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!Alexey Fyodorov
 
Pragmatic functional refactoring with java 8 (1)
Pragmatic functional refactoring with java 8 (1)Pragmatic functional refactoring with java 8 (1)
Pragmatic functional refactoring with java 8 (1)RichardWarburton
 
Generics Past, Present and Future
Generics Past, Present and FutureGenerics Past, Present and Future
Generics Past, Present and FutureRichardWarburton
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEschashnikov
 
Serialization and performance in Java
Serialization and performance in JavaSerialization and performance in Java
Serialization and performance in JavaStrannik_2013
 
OOP paradigm, principles of good design and architecture of Java applications
OOP paradigm, principles of good design and architecture of Java applicationsOOP paradigm, principles of good design and architecture of Java applications
OOP paradigm, principles of good design and architecture of Java applicationsMikalai Alimenkou
 
JEEConf 2016. Effectiveness and code optimization in Java applications
JEEConf 2016. Effectiveness and code optimization in  Java applicationsJEEConf 2016. Effectiveness and code optimization in  Java applications
JEEConf 2016. Effectiveness and code optimization in Java applicationsStrannik_2013
 
Java concurrency in practice
Java concurrency in practiceJava concurrency in practice
Java concurrency in practiceMikalai Alimenkou
 

Viewers also liked (12)

Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)
 
CompletableFuture уже здесь
CompletableFuture уже здесьCompletableFuture уже здесь
CompletableFuture уже здесь
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!
 
Pragmatic functional refactoring with java 8 (1)
Pragmatic functional refactoring with java 8 (1)Pragmatic functional refactoring with java 8 (1)
Pragmatic functional refactoring with java 8 (1)
 
Generics Past, Present and Future
Generics Past, Present and FutureGenerics Past, Present and Future
Generics Past, Present and Future
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
 
Why do I hate Hibernate?
Why do I hate Hibernate?Why do I hate Hibernate?
Why do I hate Hibernate?
 
Serialization and performance in Java
Serialization and performance in JavaSerialization and performance in Java
Serialization and performance in Java
 
OOP paradigm, principles of good design and architecture of Java applications
OOP paradigm, principles of good design and architecture of Java applicationsOOP paradigm, principles of good design and architecture of Java applications
OOP paradigm, principles of good design and architecture of Java applications
 
Scala Rock-Painting
Scala Rock-PaintingScala Rock-Painting
Scala Rock-Painting
 
JEEConf 2016. Effectiveness and code optimization in Java applications
JEEConf 2016. Effectiveness and code optimization in  Java applicationsJEEConf 2016. Effectiveness and code optimization in  Java applications
JEEConf 2016. Effectiveness and code optimization in Java applications
 
Java concurrency in practice
Java concurrency in practiceJava concurrency in practice
Java concurrency in practice
 

Similar to Atomics, CAS and Nonblocking algorithms

Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovNonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovJavaDayUA
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Dmitry Tsitelov
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5Technopark
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1921519
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresProit-people
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel ComputingAndrii Rodionov
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейCisco Russia
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Roman Elizarov
 
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Ontico
 
Проблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDNПроблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDNARCCN
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Дмитрий Еманов — Под капотом серверного ПО
Дмитрий Еманов — Под капотом серверного ПОДмитрий Еманов — Под капотом серверного ПО
Дмитрий Еманов — Под капотом серверного ПОDaria Oreshkina
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 

Similar to Atomics, CAS and Nonblocking algorithms (20)

Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey FyodorovNonblocking algorithms/CAS/Atomics by Alexey Fyodorov
Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Lab5
Lab5Lab5
Lab5
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
 
Multimaster2
Multimaster2Multimaster2
Multimaster2
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
 
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
 
Проблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDNПроблематика создания OpenFlow контроллеров для SDN
Проблематика создания OpenFlow контроллеров для SDN
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Дмитрий Еманов — Под капотом серверного ПО
Дмитрий Еманов — Под капотом серверного ПОДмитрий Еманов — Под капотом серверного ПО
Дмитрий Еманов — Под капотом серверного ПО
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Dev collaboration
Dev collaborationDev collaboration
Dev collaboration
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 

More from Alexey Fyodorov

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmAlexey Fyodorov
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуAlexey Fyodorov
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itAlexey Fyodorov
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМСAlexey Fyodorov
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых ПотоковAlexey Fyodorov
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Alexey Fyodorov
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Alexey Fyodorov
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы JavaAlexey Fyodorov
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing worldAlexey Fyodorov
 

More from Alexey Fyodorov (11)

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithm
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другу
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМС
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых Потоков
 
Philosophers
PhilosophersPhilosophers
Philosophers
 
Java in Motion
Java in MotionJava in Motion
Java in Motion
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы Java
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing world
 

Atomics, CAS and Nonblocking algorithms

  • 2. @23derevo —  Oracle — 2011–2014 —  Java Compatibility Kit (JCK) —  OK.ru — since 2014 — Technology Evangelist —  JUG.ru Group —  JUG.ru & CodeFreeze — since 2012 —  JPoint & Joker — since 2013 —  Mobius & .NEXT — since 2014 2
  • 3. 3
  • 4. О чем этот доклад 4
  • 5. О чем этот доклад 5
  • 6. Модели —  Модель с разделяемой памятью —  Регистры — Операции: read, write —  Удобно программировать, все привыкли —  Модель с передачей сообщений —  Послать сообщение —  Похожа на то, как реально работает железо 6
  • 7. Терминология —  Нет устоявшейся терминологии —  Термины: —  Parallel —  Concurrent —  Distributed 7
  • 8. Виды параллелизма —  На уровне операционной системы —  На уровне одной программы / процесса 8
  • 9. Параллелизм — ОС —  Слушать музыку и переписываться в фейсбуке в Одноклассниках —  При зависании одной программы другие продолжают работать —  и т.п. 9
  • 10. Преимущества параллелизма —  Использование нескольких ядер/процессоров —  Да и на 1 ядре тоже! (async I/O) —  Простота моделирования —  Абстракция: фреймворк забирает сложность —  Упрощенная обработка асинхронных событий —  Более отзывчивые интерфейсы пользователя —  Event Dispatch Thread (EDT), async calls 10
  • 11. Параллелизм на уровне отдельно взятой программы —  Эффективное использование ресурсов —  Удобство, простота написания кода —  Справедливость —  Обработка запросов пользователей на серверах соцсети с одинаковым приоритетом —  Читатели и писатели — Fairness (честность) 11
  • 13. Честность 13 Lock lock = new ReentrantLock(true);
  • 14. Честность 14 Lock lock = new ReentrantLock(true);
  • 16. Блокировки —  java.util.concurrent — since Java 5 —  Lock —> ReentrantLock —  ReadWriteLock —> ReentrantReadWriteLock —  StampedLock — since Java 8 —  Synchronized method / section —  wait() / notify() / notifyAll() 16
  • 17. Блокировки —  java.util.concurrent —  Lock —> ReentrantLock —  ReadWriteLock —> ReentrantReadWriteLock —  Syncronized method / section —  wait() / notify() / notifyAll() 17 Общее: ожидание
  • 18. Проблемы блокировок —  Взаимоблокировки (Deadlocks) —  Инверсия приоритетов —  Надежность — вдруг владелец блокировки помрет? —  Performance —  Параллелизма в критической секции нет! —  Владелец блокировки может быть вытеснен планировщиком 18
  • 19. Закон Амдала —  α — часть общего объема вычислений, которую нельзя распараллелить —  1-α — часть, которую можно распараллелить —  p — количество потоков 19
  • 20. Закон Амдала —  α — часть общего объема вычислений, которую нельзя распараллелить —  1-α — часть, которую можно распараллелить —  p — количество потоков 20
  • 21. Алгоритмы без блокировок —  Без препятствий (Obstruction-Free) — Поток совершает прогресс, если не встречает препятствий со стороны других потоков —  Без блокировок (Lock-Free) — гарантируется системный прогресс хотя бы одного потока —  Без ожидания (Wait-Free) — каждая операция выполняется за фиксированное число шагов, не зависящее от других потоков 21
  • 22. Консенсус —  Объект consensus с операцией decide(v): —  consensus.decide(v) ≠ const —  Wait-free —  N Потоков вызывают consensus.decide() —  i-ый поток вызывает consensus.decide(vi) —  Каждый поток вызывает не более 1 раза —  decide() возвращает одно из vi —  decide() — протокол консенсуса 22
  • 23. Консенсусное число —  Мощность консенсуса — максимальное количество (N) потоков, для которых данный объект обеспечивает консенсус —  Консенсусное число примитива синхронизации — максимальная мощность консенсуса, который можно построить на базе данного примитива и некоторого количества атомарных регистров —  То есть, существует реализация метода decide для N потоков, использующая данный примитив как строительный блок 23
  • 24. Консенсусное число —  Операции на регистрах — 1 —  Read-Modification-Write (RMW) — 2 —  Common2 Class — коммутируют друг с другом или перезаписывают друг друга —  Универсальные операции — ∞ — Сравнение с обменом (CAS): Compare-And-Swap, Compare-And-Set 24
  • 25. Compare and Swap —  Compare-and-swap (CAS) —  IA32, x64 —  SPARC —  loadlinked + store-conditional (LL/SC) —  PowerPC —  ARM 25
  • 27. Типичный паттерн применения 1. Прочитать значение A из переменной V 2. Взять какое-то новое значение B для V 3. Использовать CAS для атомарного изменения V из A в B до тех пор, пока другие потоки меняют значение V во время этого процесса Атомарность Read-Modify-Write реализуется за счет постоянного мониторинга системы на предмет постороннего вмешательства 27
  • 29. Fast path vs. long path —  Каждый блок кода может иметь, как минимум, два пути исполнения: короткий и длинный —  Lock: contended vs. Uncontended —  Uncontended Lock: —  ≥ 1 CAS —  Другая машинерия вокруг lock 29
  • 30. Недостатки CAS —  CAS заставляет потоки, которые его вызывают, работать в условиях соревнования (contention) —  Больше contention = больше бесполезных циклов процессора, трата процессорного времени —  Написание корректных и быстрых алгоритмов на CAS требует специальной подготовки 30
  • 31. Поддержка CAS в JVM —  В Java 5 появился JSR166 —  пакет java.util.concurrent —  пакет java.util.concurrent.atomic —  На платформах, поддерживающих CAS, JIT- компилятор делает inline соответствующих машинных инструкций —  Load Linked / Store Conditional —  Интерпретатор использует Spin Lock 31
  • 32. Atomic variable classes —  Scalars —  Field updaters —  Arrays —  Compound variables —  Accumulators —  since Java 8 32
  • 33. Scalars —  AtomicBoolean —  AtomicInteger —  AtomicLong —  AtomicReference 33
  • 34. AtomicInteger —  boolean compareAndSet(int expect, int update) —  int addAndGet(int delta) —  int getAndDecrement() —  int getAndIncrement() —  int incrementAndGet() —  … 34
  • 37. Field Updaters —  AtomicIntegerFieldUpdater —  Reflection-based updater for volatile int —  AtomicLongFieldUpdater —  Reflection-based updater for volatile long —  AtomicReferenceFieldUpdater —  Reflection-based updater for object 37
  • 38. AtomicLongFieldUpdater —  long addAndGet(T obj, long delta) —  boolean compareAndSet(T obj, long expect, long update) —  long getAndAdd(T obj, long delta) —  long incrementAndGet(T obj) 38
  • 41. Atomic Arrays —  AtomicIntegerArray —  AtomicLongArray —  AtomicReferenceArray 41
  • 42. AtomicLongArray —  long addAndGet(int i, long delta) —  long getAndAdd(int i, long delta) —  boolean compareAndSet(int i, long expect, long update) —  long incrementAndGet(int i) —  … 42
  • 43. Compound Variables —  AtomicMarkableReference —  compareAndSet( V expectedReference, V newReference, boolean expectedMark, boolean newMark) —  AtomicStampedReference —  boolean compareAndSet( V expectedReference, V newReference, int expectedStamp, int newStamp) 43
  • 44. Accumulators —  DoubleAccumulator —  DoubleAdder —  LongAccumulator —  LongAdder —  (Striped64) 44
  • 45. LongAccumulator —  void accumulate(long x) —  long get() —  long getThenReset() —  Void reset() 45
  • 46. Неблокирующие алгоритмы —  Алгоритм называется неблокирующим, если отказ или остановка любого потока не может привести к отказу или остановке любого другого потока —  Алгоритм называется свободным от блокировок, если на каждом шаге какой-то поток выполняет работу (make progress) —  Аглоритмы на CAS могут быть одновременно неблокирующими и свободными от блокировок 46
  • 51. Неблокирующая очередь —  Michael and Scott, 1996 —  Алгоритм неочевидный —  Потоки помогают друг другу 51
  • 52. 52
  • 54. Литература —  java.util.concurrent.atomic — Java 8 doc http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html —  Brian Goetz,Java Concurrency in Practice http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601 —  Herlihy, Shavit The Art of Multiprocessor Programming http://www.amazon.com/The-Multiprocessor-Programming-Revised-Reprint/dp/0123973376 —  Nitsan Wakart, Degrees of (Lock/Wait) Freedom http://psy-lob-saw.blogspot.com/2015/05/degrees-of-lockwait-freedom.html —  OpenJDK sources 54