nonblocking algorithms/cas/atomics by alexey fyodorov

65
Алексей Федоров, Одноклассники / JUG.ru Атомики, CAS и неблокирующие алгоритмы

Upload: javadayua

Post on 16-Apr-2017

155 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Алексей  Федоров,  Одноклассники  / JUG.ru

Атомики,  CAS  и  неблокирующие  алгоритмы

Page 2: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Зачем  вы  здесь?

Page 3: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

3

Page 4: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

4Модели

• Модель  с  разделяемой  памятью- Регистры

- Операции:  read,  write- Удобно  программировать,  все  привыкли

• Модель  с  передачей  сообщений- Послать  сообщение- Похожа  на  то,  как  реально  работает  железо

Page 5: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

5Терминология

• Нет  устоявшейся  терминологии• Термины:• Parallel

- Concurrent- Distributed

Page 6: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

6Виды  параллелизма

• На  уровне  операционной  системы• На  уровне  одной  программы  /  процесса

Page 7: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

7Параллелизм  — ОС

• Слушать  музыку  и  переписываться  в  фейсбуке в  Одноклассниках

• При  зависании  одной  программы  другие  продолжают  работать

• и  т.п.

Page 8: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

8Преимущества  параллелизма

• Использование  нескольких  ядер/процессоров- Да  и  на  1  ядре  тоже!  (async I/O)

• Простота  моделирования- Абстракция:  фреймворкзабирает  сложность

• Упрощенная  обработка  асинхронных  событий

• Более  отзывчивые  интерфейсы  пользователя- Event  Dispatch  Thread  (EDT),  async calls

Page 9: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

9Параллелизм  на  уровне  отдельно  взятой  программы

• Эффективное  использование  ресурсов• Удобство,  простота  написания  кода• Справедливость  

- Обработка  запросов  пользователей  на  серверах  соцсети с  одинаковым  приоритетом

- Читатели  и  писатели- Fairness  (честность)

Page 10: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

10

Lock lock = new ReentrantLock(true);

Page 11: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

11Честность!

Lock lock = new ReentrantLock(true);

Page 12: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

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

14Проблемы  блокировок

• Взаимоблокировки  (Deadlocks)• Инверсия  приоритетов• Надежность  — вдруг  владелец  блокировки  помрет?• Performance

- Параллелизма  в  критической  секции  нет!- Владелец  блокировки  может  быть  вытеснен  

планировщиком

Page 15: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

15Закон  Амдала

• α — часть  общего  объема  вычислений,  которую  нельзя  распараллелить  

• 1-α — часть,  которую  можно  распараллелить

• p — количество  потоков

Page 16: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

16Закон  Амдала

• α — часть  общего  объема  вычислений,  которую  нельзя  распараллелить  

• 1-α — часть,  которую  можно  распараллелить

• p — количество  потоков

Page 17: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Неблокирующие  алгоритмы

Page 18: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

18Классификация

• Без  препятствий  (Obstruction-­‐Free)  — поток  совершает  прогресс,  если  не  встречает  препятствий  со  стороны  других  потоков

• Без  блокировок  (Lock-­‐Free)— гарантируется  системный  прогресс  хотя  бы  одного  потока

• Без  ожидания (Wait-­‐Free)—каждая  операция  выполняется  за  фиксированное  число  шагов,  не  зависящее  от  других  потоков

Page 19: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

20Консенсусное число

• Мощность  консенсуса  — максимальное  количество  (N) потоков,  для  которых  данный  объект  обеспечивает  консенсус

• Консенсусное число  примитива  синхронизации  —максимальная  мощность  консенсуса,  который  можно  построить  на  базе  данного  примитива и  некоторого  количества  атомарных  регистров- То  есть,  существует  реализация  метода  decide  для  N  потоков,  

использующая  данный  примитив  как  строительный  блок

Page 21: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

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

23Семантика  CAS

Page 24: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

24CAS  Loop  — типичный  паттерн  применения

1. Прочитать  значение  A  из  переменной  V2. Взять  какое-­‐то  новое  значение  B  для  V3. Использовать  CAS  для  атомарного  изменения  V  из  A  в  B до  тех  

пор,  пока  другие  потоки  меняют  значение  V  во  время  этого  процесса

Атомарность Read-­‐Modify-­‐Write  реализуется  за  счет  постоянного  мониторинга системы  на  предмет  постороннего  вмешательства

Page 25: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

25Пример:  неблокирующий  счетчик

Page 26: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

26Fast  vs.  slow  path

• Каждый  блок  кода  может  иметь,  как  минимум,  два  пути  исполнения:  короткий  и  длинный

• Lock:  contended  vs.  Uncontended

• Uncontended  Lock:- ≥  1  CAS

Page 27: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

27Недостатки  CAS

• CAS  заставляет  потоки,  которые  его  вызывают,  работать  в  условиях  соревнования  (contention)- Больше  contention  =  больше  бесполезных  циклов  

процессора,  трата  процессорного  времени

• Написание  корректных  и  быстрых  алгоритмов  на    CAS  требует  специальной  подготовки

Page 28: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Поддержка  в  Java

Page 29: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

30Atomic  variable  classes

• Scalars• Field  updaters• Arrays• Compound  variables• Accumulators

- since  Java  8

Page 31: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

31Scalars

• AtomicBoolean• AtomicInteger• AtomicLong• AtomicReference

Page 32: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

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

34

Page 35: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

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

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

38

Page 39: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

39Multivariable   Invariant

Page 40: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

40Multivariable   Invariant

Page 41: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

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

Demo.  Legacy  Volatile  Counter

Page 44: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

44AtomicLongFieldUpdater

Page 45: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

45AtomicLongFieldUpdater

Page 46: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

46AtomicArrays

• AtomicIntegerArray

• AtomicLongArray

• AtomicReferenceArray

Page 47: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

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

49Accumulators

• DoubleAccumulator

• DoubleAdder

• LongAccumulator

• LongAdder

• (Striped64)

Page 50: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

50LongAccumulator

• void  accumulate(long  x)

• long  get()

• long  getThenReset()

• Void  reset()

Page 51: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

51

• Алгоритм  называется  неблокирующим  (nonblocking),  если  отказ  или  остановка  любого  потока  не  может  привести  к  отказу  или  остановке  любого  другого  потока

• Алгоритм  называется  свободным  от  блокировок (lock-­‐free),  если  на  каждом  шаге  какой-­‐то  поток  выполняет  работу  (make  progress)

51

Неблокирующие  алгоритмы

Page 52: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

52

• Алгоритм  называется  неблокирующим  (nonblocking),  если  отказ  или  остановка  любого  потока  не  может  привести  к  отказу  или  остановке  любого  другого  потока

• Алгоритм  называется  свободным  от  блокировок (lock-­‐free),  если  на  каждом  шаге  какой-­‐то  поток  выполняет  работу  (make  progress)

• nonblockingи  lock-­‐free  — это  разные  вещи!- Алгоритмы  на  CAS  могут быть  одновременно  неблокирующими  и  

свободными  от  блокировок  

52

Неблокирующие  алгоритмы

Page 53: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

53Неблокирующий  стек

Page 54: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

54Неблокирующий  стек

Page 55: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

55Неблокирующий  стек

Page 56: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

56Неблокирующая  очередь

• Michael  and  Scott,  1996• Потоки  помогают друг  другу

Page 57: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Литература

Page 58: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

58

Page 59: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

59

Page 60: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

60

Page 61: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

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

62Много  полезных  видео

Page 63: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

63

https://bitbucket.org/23derevo/concurrency

Page 64: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Вопросы  и  ответы

Page 65: Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

Спасибо  за  внимание!

@[email protected]@corp.mail.ru