nonblocking algorithms/cas/atomics by alexey fyodorov
TRANSCRIPT
![Page 1: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/1.jpg)
Алексей Федоров, Одноклассники / JUG.ru
Атомики, CAS и неблокирующие алгоритмы
![Page 2: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/2.jpg)
Зачем вы здесь?
![Page 3: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/3.jpg)
3
![Page 4: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/4.jpg)
4Модели
• Модель с разделяемой памятью- Регистры
- Операции: read, write- Удобно программировать, все привыкли
• Модель с передачей сообщений- Послать сообщение- Похожа на то, как реально работает железо
![Page 5: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/5.jpg)
5Терминология
• Нет устоявшейся терминологии• Термины:• Parallel
- Concurrent- Distributed
![Page 6: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/6.jpg)
6Виды параллелизма
• На уровне операционной системы• На уровне одной программы / процесса
![Page 7: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/7.jpg)
7Параллелизм — ОС
• Слушать музыку и переписываться в фейсбуке в Одноклассниках
• При зависании одной программы другие продолжают работать
• и т.п.
![Page 8: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/8.jpg)
8Преимущества параллелизма
• Использование нескольких ядер/процессоров- Да и на 1 ядре тоже! (async I/O)
• Простота моделирования- Абстракция: фреймворкзабирает сложность
• Упрощенная обработка асинхронных событий
• Более отзывчивые интерфейсы пользователя- Event Dispatch Thread (EDT), async calls
![Page 9: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/9.jpg)
9Параллелизм на уровне отдельно взятой программы
• Эффективное использование ресурсов• Удобство, простота написания кода• Справедливость
- Обработка запросов пользователей на серверах соцсети с одинаковым приоритетом
- Читатели и писатели- Fairness (честность)
![Page 10: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/10.jpg)
10
Lock lock = new ReentrantLock(true);
![Page 11: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/11.jpg)
11Честность!
Lock lock = new ReentrantLock(true);
![Page 12: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/12.jpg)
12Блокировки
• java.util.concurrent — since Java 5- Lock —> ReentrantLock- ReadWriteLock —> ReentrantReadWriteLock- StampedLock — since Java 8
• Synchronized method / section• wait() / notify() / notifyAll()
![Page 13: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/13.jpg)
13Блокировки
• java.util.concurrent — since Java 5- Lock —> ReentrantLock- ReadWriteLock —> ReentrantReadWriteLock- StampedLock — since Java 8
• Synchronized method / section• wait() / notify() / notifyAll()
Общее: ожидание
![Page 14: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/14.jpg)
14Проблемы блокировок
• Взаимоблокировки (Deadlocks)• Инверсия приоритетов• Надежность — вдруг владелец блокировки помрет?• Performance
- Параллелизма в критической секции нет!- Владелец блокировки может быть вытеснен
планировщиком
![Page 15: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/15.jpg)
15Закон Амдала
• α — часть общего объема вычислений, которую нельзя распараллелить
• 1-α — часть, которую можно распараллелить
• p — количество потоков
![Page 16: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/16.jpg)
16Закон Амдала
• α — часть общего объема вычислений, которую нельзя распараллелить
• 1-α — часть, которую можно распараллелить
• p — количество потоков
![Page 17: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/17.jpg)
Неблокирующие алгоритмы
![Page 18: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/18.jpg)
18Классификация
• Без препятствий (Obstruction-‐Free) — поток совершает прогресс, если не встречает препятствий со стороны других потоков
• Без блокировок (Lock-‐Free)— гарантируется системный прогресс хотя бы одного потока
• Без ожидания (Wait-‐Free)—каждая операция выполняется за фиксированное число шагов, не зависящее от других потоков
![Page 19: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/19.jpg)
19Консенсус
• Объект consensus с операцией decide(v):- consensus.decide(v) ≠ const- wait-‐free
• N Потоков вызывают consensus.decide()- i-‐ый поток вызывает consensus.decide(vi)- Каждый поток вызывает не более 1 раза- decide() возвращает одно из vi
• decide() — протокол консенсуса
![Page 20: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/20.jpg)
20Консенсусное число
• Мощность консенсуса — максимальное количество (N) потоков, для которых данный объект обеспечивает консенсус
• Консенсусное число примитива синхронизации —максимальная мощность консенсуса, который можно построить на базе данного примитива и некоторого количества атомарных регистров- То есть, существует реализация метода decide для N потоков,
использующая данный примитив как строительный блок
![Page 21: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/21.jpg)
21Консенсусные числа различных операций
• Операции на регистрах — 1• Read-‐Modification-‐Write (RMW)— 2
- Common2 Class— коммутируют друг с другом или перезаписывают друг друга
- Универсальные операции —∞- Сравнение с обменом (CAS):
Compare-‐And-‐Swap, Compare-‐And-‐Set
![Page 22: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/22.jpg)
22Compare and Swap
• Compare-‐and-‐swap (CAS)- IA32, x64 - SPARC
• load-‐linked / store-‐conditional (LL/SC)- PowerPC- ARM
![Page 23: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/23.jpg)
23Семантика CAS
![Page 24: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/24.jpg)
24CAS Loop — типичный паттерн применения
1. Прочитать значение A из переменной V2. Взять какое-‐то новое значение B для V3. Использовать CAS для атомарного изменения V из A в B до тех
пор, пока другие потоки меняют значение V во время этого процесса
Атомарность Read-‐Modify-‐Write реализуется за счет постоянного мониторинга системы на предмет постороннего вмешательства
![Page 25: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/25.jpg)
25Пример: неблокирующий счетчик
![Page 26: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/26.jpg)
26Fast vs. slow path
• Каждый блок кода может иметь, как минимум, два пути исполнения: короткий и длинный
• Lock: contended vs. Uncontended
• Uncontended Lock:- ≥ 1 CAS
![Page 27: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/27.jpg)
27Недостатки CAS
• CAS заставляет потоки, которые его вызывают, работать в условиях соревнования (contention)- Больше contention = больше бесполезных циклов
процессора, трата процессорного времени
• Написание корректных и быстрых алгоритмов на CAS требует специальной подготовки
![Page 28: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/28.jpg)
Поддержка в Java
![Page 29: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/29.jpg)
29Поддержка CAS в Java
• В Java 5 появился JSR166- пакет java.util.concurrent- пакет java.util.concurrent.atomic
• На платформах, поддерживающих CAS, JIT-‐компилятор делает inline соответствующих машинных инструкций
• Load Linked / Store Conditional
![Page 30: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/30.jpg)
30Atomic variable classes
• Scalars• Field updaters• Arrays• Compound variables• Accumulators
- since Java 8
![Page 31: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/31.jpg)
31Scalars
• AtomicBoolean• AtomicInteger• AtomicLong• AtomicReference
![Page 32: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/32.jpg)
32AtomicLong
• boolean compareAndSet(int expect, int update)• long addAndGet(int delta)• long getAndAdd(int delta)• long getAndDecrement()• long getAndIncrement()• long incrementAndGet()• …
![Page 33: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/33.jpg)
33AtomicLong
• boolean compareAndSet(int expect, int update)• long addAndGet(int delta)• long getAndAdd(int delta)• long getAndDecrement()• long getAndIncrement()• long incrementAndGet()• …
![Page 34: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/34.jpg)
34
![Page 35: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/35.jpg)
35
atomicLong.getAndAdd(5)
loop:mov 0x10(%rbx),%raxmov %rax,%r11add $0x5,%r11lock cmpxchg %r11,0x10(%rbx)sete %r11bmovzbl %r11b,%r11dtest %r10d,%r10dje loop
JDK 7u80 -‐XX:+PrintAssembly
![Page 36: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/36.jpg)
36
atomicLong.getAndAdd(5)
lock addq $0x5,0x10(%rbp))loop:mov 0x10(%rbx),%raxmov %rax,%r11add $0x5,%r11lock cmpxchg %r11,0x10(%rbx)sete %r11bmovzbl %r11b,%r11dtest %r10d,%r10dje loop
JDK 7u80 -‐XX:+PrintAssembly JDK 8u60 -‐XX:+PrintAssembly
![Page 37: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/37.jpg)
37
atomicLong.getAndAdd(5)
lock addq $0x5,0x10(%rbp))loop:mov 0x10(%rbx),%raxmov %rax,%r11add $0x5,%r11lock cmpxchg %r11,0x10(%rbx)sete %r11bmovzbl %r11b,%r11dtest %r10d,%r10dje loop
JDK 7u80 -‐XX:+PrintAssembly JDK 8u60 -‐XX:+PrintAssembly
83
46
15 11
132105
45 43
1 2 3 4
ops / μs
threads
![Page 38: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/38.jpg)
38
![Page 39: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/39.jpg)
39Multivariable Invariant
![Page 40: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/40.jpg)
40Multivariable Invariant
![Page 41: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/41.jpg)
41Field Updaters
• AtomicIntegerFieldUpdater- Reflection-‐based updater for volatile int
• AtomicLongFieldUpdater- Reflection-‐based updater for volatile long
• AtomicReferenceFieldUpdater
- Reflection-‐based updater for volatile object
![Page 42: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/42.jpg)
42AtomicLongFieldUpdater
long addAndGet(T obj, long delta)
boolean compareAndSet(T obj, long exp, long upd)
long getAndAdd(T obj, long delta)
long incrementAndGet(T obj)
![Page 43: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/43.jpg)
Demo. Legacy Volatile Counter
![Page 44: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/44.jpg)
44AtomicLongFieldUpdater
![Page 45: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/45.jpg)
45AtomicLongFieldUpdater
![Page 46: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/46.jpg)
46AtomicArrays
• AtomicIntegerArray
• AtomicLongArray
• AtomicReferenceArray
![Page 47: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/47.jpg)
47AtomicLongArray
• long addAndGet(int i, long delta)
• long getAndAdd(int i, long delta)
• boolean compareAndSet(int i, long exp, long upd)
• long incrementAndGet(int i)
• …
![Page 48: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/48.jpg)
48Compound Variables
AtomicMarkableReferenceV compareAndSet(
V expectedRef, V newRef, boolean expectedMark, boolean newMark)
AtomicStampedReferenceboolean compareAndSet(
V expectedRef, V newRef, int expectedStamp, int newStamp)
![Page 49: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/49.jpg)
49Accumulators
• DoubleAccumulator
• DoubleAdder
• LongAccumulator
• LongAdder
• (Striped64)
![Page 50: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/50.jpg)
50LongAccumulator
• void accumulate(long x)
• long get()
• long getThenReset()
• Void reset()
![Page 51: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/51.jpg)
51
• Алгоритм называется неблокирующим (nonblocking), если отказ или остановка любого потока не может привести к отказу или остановке любого другого потока
• Алгоритм называется свободным от блокировок (lock-‐free), если на каждом шаге какой-‐то поток выполняет работу (make progress)
51
Неблокирующие алгоритмы
![Page 52: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/52.jpg)
52
• Алгоритм называется неблокирующим (nonblocking), если отказ или остановка любого потока не может привести к отказу или остановке любого другого потока
• Алгоритм называется свободным от блокировок (lock-‐free), если на каждом шаге какой-‐то поток выполняет работу (make progress)
• nonblockingи lock-‐free — это разные вещи!- Алгоритмы на CAS могут быть одновременно неблокирующими и
свободными от блокировок
52
Неблокирующие алгоритмы
![Page 53: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/53.jpg)
53Неблокирующий стек
![Page 54: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/54.jpg)
54Неблокирующий стек
![Page 55: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/55.jpg)
55Неблокирующий стек
![Page 56: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/56.jpg)
56Неблокирующая очередь
• Michael and Scott, 1996• Потоки помогают друг другу
![Page 57: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/57.jpg)
Литература
![Page 58: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/58.jpg)
58
![Page 59: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/59.jpg)
59
![Page 60: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/60.jpg)
60
![Page 61: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/61.jpg)
61DL и все-все-все
http://altair.cs.oswego.edu/mailman/listinfo/concurrency-‐interest
To post a message to all the list members, send email toconcurrency-‐[email protected]
![Page 62: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/62.jpg)
62Много полезных видео
![Page 63: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/63.jpg)
63
https://bitbucket.org/23derevo/concurrency
![Page 64: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov](https://reader030.vdocuments.net/reader030/viewer/2022020301/586f92431a28ab54768b7f53/html5/thumbnails/64.jpg)
Вопросы и ответы