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

Post on 15-Jan-2017

1.233 Views

Category:

Engineering

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

@ #devclub

Кто вы?

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

4

5

Модели

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

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

6

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

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

7

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

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

8

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

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

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

• ит.п.

9

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

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

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

10

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

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

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

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

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

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

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

12

Lock lock = new ReentrantLock(true);

13

Честность!

Lock lock = new ReentrantLock(true);

14

Блокировки

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

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

15

Блокировки

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

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

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

16

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

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

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

17

Закон Амдала

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

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

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

18

Закон Амдала

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

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

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

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

20

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

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

21

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

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

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

22

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

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

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

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

23

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

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

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

24

Compare and Swap

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

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

25Семантика CAS

26

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

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

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

27

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

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

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

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

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

29

Fast vs. slow path

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

• Lock:contendedvs.Uncontended

• UncontendedLock:- ≥1CAS

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

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

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

Поддержка в Java

32

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

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

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

• LoadLinked/StoreConditional

33

Atomic variable classes

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

34

Scalars

• AtomicBoolean• AtomicInteger• AtomicLong• AtomicReference

35

AtomicLong

• boolean compareAndSet(int expect, intupdate)

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

36

AtomicLong

• boolean compareAndSet(int expect, intupdate)

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

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

38 JDK 7u80 — atomicLong.getAndAdd(5)

39 JDK 8u66 — atomicLong.getAndAdd(5)

ХардкорЪ

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

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

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

44Multivariable Invariant

45Multivariable Invariant

46

Field Updaters

• AtomicIntegerFieldUpdater- Reflection-basedupdaterforvolatileint

• AtomicLongFieldUpdater- Reflection-basedupdaterforvolatilelong

• AtomicReferenceFieldUpdater

- Reflection-basedupdaterforvolatileobject

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)

Demo. Legacy Volatile Counter

49 AtomicLongFieldUpdater

50 AtomicLongFieldUpdater

51

AtomicArrays

• AtomicIntegerArray

• AtomicLongArray

• AtomicReferenceArray

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)

• …

53Compound Variables

AtomicMarkableReferenceV compareAndSet(

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

AtomicStampedReferenceboolean compareAndSet(

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

54

Accumulators

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

55

LongAccumulator

• void accumulate(long x)

• long get()

• long getThenReset()

• Void reset()

56

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

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

56

57

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

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

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

57

58

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

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

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

58

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

59

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

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

Литература

61

62

63

64

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

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

To post a message to all the list members, send email toconcurrency-interest@cs.oswego.edu

65

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

66

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

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

68

Development @ Odnoklassniki

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

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

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

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

@23derevoalexey@jugru.orgalexey.fyodorov@corp.mail.ru

top related