Синхронизация без блокировок и СМС

69
Алексей Федоров, Одноклассники / JUG.ru Синхронизация без блокировок и СМС @ #devclub

Upload: alexey-fyodorov

Post on 15-Jan-2017

1.233 views

Category:

Engineering


2 download

TRANSCRIPT

Page 1: Синхронизация без блокировок и СМС

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

Синхронизация без блокировок и СМС

@ #devclub

Page 2: Синхронизация без блокировок и СМС

Кто вы?

Page 3: Синхронизация без блокировок и СМС

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

Page 4: Синхронизация без блокировок и СМС

4

Page 5: Синхронизация без блокировок и СМС

5

Модели

• Модельсразделяемойпамятью- Регистры-Операции:read,write

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

Page 6: Синхронизация без блокировок и СМС

6

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

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

Page 7: Синхронизация без блокировок и СМС

7

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

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

Page 8: Синхронизация без блокировок и СМС

8

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

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

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

• ит.п.

Page 9: Синхронизация без блокировок и СМС

9

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

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

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

Page 10: Синхронизация без блокировок и СМС

10

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

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

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

• Упрощеннаяобработкаасинхронныхсобытий• Болееотзывчивыеинтерфейсыпользователя- EventDispatchThread(EDT),async calls

Page 11: Синхронизация без блокировок и СМС

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

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

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

Page 12: Синхронизация без блокировок и СМС

12

Lock lock = new ReentrantLock(true);

Page 13: Синхронизация без блокировок и СМС

13

Честность!

Lock lock = new ReentrantLock(true);

Page 14: Синхронизация без блокировок и СМС

14

Блокировки

• java.util.concurrent — since Java 5- Lock —> ReentrantLock- ReadWriteLock —> ReentrantReadWriteLock- StampedLock — since Java 8

• Synchronized method / section• wait() / notify() / notifyAll()

Page 15: Синхронизация без блокировок и СМС

15

Блокировки

• java.util.concurrent — since Java 5- Lock —> ReentrantLock- ReadWriteLock —> ReentrantReadWriteLock- StampedLock — since Java 8

• Synchronized method / section• wait() / notify() / notifyAll()

Общее: ожидание

Page 16: Синхронизация без блокировок и СМС

16

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

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

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

Page 17: Синхронизация без блокировок и СМС

17

Закон Амдала

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

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

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

Page 18: Синхронизация без блокировок и СМС

18

Закон Амдала

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

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

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

Page 19: Синхронизация без блокировок и СМС

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

Page 20: Синхронизация без блокировок и СМС

20

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

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

Page 21: Синхронизация без блокировок и СМС

21

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

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

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

Page 22: Синхронизация без блокировок и СМС

22

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

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

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

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

Page 23: Синхронизация без блокировок и СМС

23

Сравнительная мощность примитивов

Консенсусные числа различных операций• Операциинарегистрах— 1• Read-Modification-Write(RMW) — 2- Common2Class — коммутируютдругсдругомилиперезаписываютдругдруга

• Универсальныеоперации—∞- Сравнениесобменом(CAS)- Compare-And-Swap,Compare-And-Set

Page 24: Синхронизация без блокировок и СМС

24

Compare and Swap

• Compare-and-swap (CAS)- IA32, x64 - SPARC

• load-linked / store-conditional (LL/SC)- PowerPC- ARM

Page 25: Синхронизация без блокировок и СМС

25Семантика CAS

Page 26: Синхронизация без блокировок и СМС

26

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

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

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

Page 27: Синхронизация без блокировок и СМС

27

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

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

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

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

Page 28: Синхронизация без блокировок и СМС

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

Page 29: Синхронизация без блокировок и СМС

29

Fast vs. slow path

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

• Lock:contendedvs.Uncontended

• UncontendedLock:- ≥1CAS

Page 30: Синхронизация без блокировок и СМС

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

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

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

Page 31: Синхронизация без блокировок и СМС

Поддержка в Java

Page 32: Синхронизация без блокировок и СМС

32

Поддержка CAS в Java

• ВJava5появилсяJSR166- пакетjava.util.concurrent- пакетjava.util.concurrent.atomic

• Наплатформах,поддерживающихCAS,JIT-компиляторделаетinlineсоответствующихмашинныхинструкций

• LoadLinked/StoreConditional

Page 33: Синхронизация без блокировок и СМС

33

Atomic variable classes

• Scalars• Field updaters• Arrays• Compound variables• Accumulators- since Java 8

Page 34: Синхронизация без блокировок и СМС

34

Scalars

• AtomicBoolean• AtomicInteger• AtomicLong• AtomicReference

Page 35: Синхронизация без блокировок и СМС

35

AtomicLong

• boolean compareAndSet(int expect, intupdate)

• long addAndGet(int delta)• long getAndAdd(int delta)• long getAndDecrement()• long getAndIncrement()• long incrementAndGet()• …

Page 36: Синхронизация без блокировок и СМС

36

AtomicLong

• boolean compareAndSet(int expect, intupdate)

• long addAndGet(int delta)• long getAndAdd(int delta)• long getAndDecrement()• long getAndIncrement()• long incrementAndGet()• …

Page 37: Синхронизация без блокировок и СМС

37

atomicInteger.getAndAdd(5) — Thanks, @AndreiPangin

JDK 7u80 JDK 8u66

83

46

15 11

132105

45 43

020406080

100120140

1 2 3 4

ops

/ μs

threads

Page 38: Синхронизация без блокировок и СМС

38 JDK 7u80 — atomicLong.getAndAdd(5)

Page 39: Синхронизация без блокировок и СМС

39 JDK 8u66 — atomicLong.getAndAdd(5)

Page 40: Синхронизация без блокировок и СМС

ХардкорЪ

Page 41: Синхронизация без блокировок и СМС

41

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 42: Синхронизация без блокировок и СМС

42

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

Page 43: Синхронизация без блокировок и СМС

43

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

83

4615 11

132105

45 43

1 2 3 4

ops

/ μs

threads

Page 44: Синхронизация без блокировок и СМС

44Multivariable Invariant

Page 45: Синхронизация без блокировок и СМС

45Multivariable Invariant

Page 46: Синхронизация без блокировок и СМС

46

Field Updaters

• AtomicIntegerFieldUpdater- Reflection-basedupdaterforvolatileint

• AtomicLongFieldUpdater- Reflection-basedupdaterforvolatilelong

• AtomicReferenceFieldUpdater

- Reflection-basedupdaterforvolatileobject

Page 47: Синхронизация без блокировок и СМС

47

AtomicLongFieldUpdater

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 48: Синхронизация без блокировок и СМС

Demo. Legacy Volatile Counter

Page 49: Синхронизация без блокировок и СМС

49 AtomicLongFieldUpdater

Page 50: Синхронизация без блокировок и СМС

50 AtomicLongFieldUpdater

Page 51: Синхронизация без блокировок и СМС

51

AtomicArrays

• AtomicIntegerArray

• AtomicLongArray

• AtomicReferenceArray

Page 52: Синхронизация без блокировок и СМС

52

AtomicLongArray

• 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 53: Синхронизация без блокировок и СМС

53Compound Variables

AtomicMarkableReferenceV compareAndSet(

V expectedReference, V newReference, boolean expectedMark, boolean newMark)

AtomicStampedReferenceboolean compareAndSet(

V expectedReference, V newReference, int expectedStamp, int newStamp)

Page 54: Синхронизация без блокировок и СМС

54

Accumulators

• DoubleAccumulator• DoubleAdder• LongAccumulator• LongAdder• (Striped64)

Page 55: Синхронизация без блокировок и СМС

55

LongAccumulator

• void accumulate(long x)

• long get()

• long getThenReset()

• Void reset()

Page 56: Синхронизация без блокировок и СМС

56

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

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

56

Page 57: Синхронизация без блокировок и СМС

57

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

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

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

57

Page 58: Синхронизация без блокировок и СМС

58

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

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

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

58

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

Page 59: Синхронизация без блокировок и СМС

59

Неблокирующие структуры данных

• Стек• Очереди-Многоразныхалгоритмов-MichaelandScott,1996- Потокипомогают другдругу

Page 60: Синхронизация без блокировок и СМС

Литература

Page 61: Синхронизация без блокировок и СМС

61

Page 62: Синхронизация без блокировок и СМС

62

Page 63: Синхронизация без блокировок и СМС

63

Page 64: Синхронизация без блокировок и СМС

64

DL и все-все-все

http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest

To post a message to all the list members, send email [email protected]

Page 65: Синхронизация без блокировок и СМС

65

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

Page 66: Синхронизация без блокировок и СМС

66

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

Page 67: Синхронизация без блокировок и СМС

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

Page 68: Синхронизация без блокировок и СМС

68

Development @ Odnoklassniki

•Blog-http://habrahabr.ru/company/odnoklassniki

•Open source-https://github.com/odnoklassniki

•Career-http://v.ok.ru

Page 69: Синхронизация без блокировок и СМС

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

@[email protected]@corp.mail.ru