Синхронизация без блокировок и СМС
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 [email protected]
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
Спасибо за внимание!
@[email protected]@corp.mail.ru