Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Алексей Федоров,
Одноклассники / JUG.ru
Синхронизация без блокировок и СМС
@ #devclub
Кто вы?
Зачем вы здесь?
4
5
Модели
• Модель	с	разделяемой	памятью
- Регистры
- Операции:	read,	write
- Удобно	программировать,	все	привыкли
• Модель...
6
Терминология
• Нет	устоявшейся	терминологии
• Термины:
• Parallel
- Concurrent
- Distributed
7
Виды параллелизма
• На	уровне	операционной	системы
• На	уровне	одной	программы	/	процесса
8
Параллелизм — ОС
• Слушать	музыку	и	переписываться	в	фейсбуке
в	Одноклассниках
• При	зависании	одной	программы	другие	
п...
9
Преимущества параллелизма
• Использование	нескольких	ядер/процессоров
- Да	и	на	1	ядре	тоже!	(async I/O)
• Простота	моде...
10
Преимущества параллелизма
• Использование	нескольких	ядер/процессоров
- Да	и	на	1	ядре	тоже!	(async I/O)
• Простота	мод...
11
Параллелизм на уровне
отдельно взятой программы
• Эффективное	использование	ресурсов
• Удобство,	простота	написания	код...
12
Lock lock = new ReentrantLock(true);
13
Честность!
Lock lock = new ReentrantLock(true);
14
Блокировки
• java.util.concurrent — since Java 5
- Lock —> ReentrantLock
- ReadWriteLock —> ReentrantReadWriteLock
- St...
15
Блокировки
• java.util.concurrent — since Java 5
- Lock —> ReentrantLock
- ReadWriteLock —> ReentrantReadWriteLock
- St...
16
Проблемы блокировок
• Взаимоблокировки	(Deadlocks)
• Инверсия	приоритетов
• Надежность	— вдруг	владелец	блокировки	
пом...
17
Закон Амдала
• α — часть	общего	объема	вычислений,	
которую	нельзя	распараллелить	
• 1-α — часть,	которую	можно	
распар...
18
Закон Амдала
• α — часть	общего	объема	вычислений,	
которую	нельзя	распараллелить	
• 1-α — часть,	которую	можно	
распар...
Неблокирующие алгоритмы
20
Классификация
• Без	препятствий	(Obstruction-Free)	— поток	
совершает	прогресс,	если	не	встречает	препятствий	
со	сторо...
21
Классификация
• Без	препятствий	(Obstruction-Free)	— поток	
совершает	прогресс,	если	не	встречает	препятствий	
со	сторо...
22
Классификация
• Без	препятствий	(Obstruction-Free)	— поток	
совершает	прогресс,	если	не	встречает	препятствий	
со	сторо...
23
Сравнительная мощность примитивов
Консенсусные числа различных операций
• Операции	на	регистрах	— 1
• Read-Modification...
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	из	переменной	V
2. Взять	какое-то	новое	значение	B	для	V...
27
CAS Loop — типичный паттерн применения
1. Прочитать	значение	A	из	переменной	V
2. Взять	какое-то	новое	значение	B	для	V...
28
Пример: неблокирующий счетчик
29
Fast vs. slow path
• Каждый	блок	кода	может	иметь,	как	минимум,	
два	пути	исполнения:	короткий	и	длинный
• Lock:	conten...
30
Недостатки CAS
• CAS	заставляет	потоки,	которые	его	вызывают,	
работать	в	условиях	соревнования	(contention)
- Больше	c...
Поддержка в Java
32
Поддержка CAS в Java
• В	Java	5	появился	JSR166
- пакет	java.util.concurrent
- пакет	java.util.concurrent.atomic
• На	п...
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, int
update)
• long addAndGet(int delta)
• long getAndAdd(int delta)
• lo...
36
AtomicLong
• boolean compareAndSet(int expect, int
update)
• long addAndGet(int delta)
• long getAndAdd(int delta)
• lo...
37
atomicInteger.getAndAdd(5) — Thanks, @AndreiPangin
JDK 7u80 JDK 8u66
83
46
15 11
132
105
45 43
0
20
40
60
80
100
120
14...
38
JDK 7u80 — atomicLong.getAndAdd(5)
39
JDK 8u66 — atomicLong.getAndAdd(5)
ХардкорЪ
41
atomicLong.getAndAdd(5)
loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add $0x5,%r11
lock cmpxchg %r11,0x10(%rbx)
sete %r11b
m...
42
atomicLong.getAndAdd(5)
lock addq $0x5, 0x10(%rbp)loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add $0x5,%r11
lock cmpxchg %r...
43
atomicLong.getAndAdd(5)
lock addq $0x5, 0x10(%rbp)loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add $0x5,%r11
lock cmpxchg %r...
44
Multivariable Invariant
45
Multivariable Invariant
46
Field Updaters
• AtomicIntegerFieldUpdater
- Reflection-based	updater	for	volatile	int
• AtomicLongFieldUpdater
- Refle...
47
AtomicLongFieldUpdater
long addAndGet(T obj, long delta)
boolean compareAndSet(T obj, long exp, long upd)
long getAndAd...
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, ...
53
Compound Variables
AtomicMarkableReference
V compareAndSet(
V expectedReference, V newReference,
boolean expectedMark, ...
54
Accumulators
• DoubleAccumulator
• DoubleAdder
• LongAccumulator
• LongAdder
• (Striped64)
55
LongAccumulator
• void accumulate(long x)
• long get()
• long getThenReset()
• Void reset()
56
Неблокирующие алгоритмы
• Алгоритм	называется	неблокирующим	
(nonblocking),	если	отказ	или	остановка	любого	
потока	не	...
57
Неблокирующие алгоритмы
• Алгоритм	называется	неблокирующим	
(nonblocking),	если	отказ	или	остановка	любого	
потока	не	...
58
Неблокирующие алгоритмы
• Алгоритм	называется	неблокирующим	
(nonblocking),	если	отказ	или	остановка	любого	
потока	не	...
59
Неблокирующие структуры данных
• Стек
• Очереди
- Много	разных	алгоритмов
- Michael	and	Scott,	1996
- Потоки	помогают д...
Литература
61
62
63
64
DL и все-все-все
http://altair.cs.oswego.edu/mailman/listinfo/co
ncurrency-interest
To post a message to all the list m...
65
Много полезных видео
66
https://bitbucket.org/23derevo/concurrency
Вопросы и ответы
68
Development @ Odnoklassniki
•Blog
-http://habrahabr.ru/company/odnoklassniki
•Open source
-https://github.com/odnoklass...
Спасибо за внимание!
@23derevo
alexey@jugru.org
alexey.fyodorov@corp.mail.ru
Vous avez terminé ce document.
Télécharger et lire hors ligne.
Prochain SlideShare
Meditation for beginners
Suivant
Prochain SlideShare
Meditation for beginners
Suivant
Télécharger pour lire hors ligne et voir en mode plein écran

Partager

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

Télécharger pour lire hors ligne

Доклад про неблокирующую синхронизацию.
Devclub @ Tallin, 25.11.2015

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

  1. 1. Алексей Федоров, Одноклассники / JUG.ru Синхронизация без блокировок и СМС @ #devclub
  2. 2. Кто вы?
  3. 3. Зачем вы здесь?
  4. 4. 4
  5. 5. 5 Модели • Модель с разделяемой памятью - Регистры - Операции: read, write - Удобно программировать, все привыкли • Модель с передачей сообщений - Послать сообщение - Похожа на то, как реально работает железо
  6. 6. 6 Терминология • Нет устоявшейся терминологии • Термины: • Parallel - Concurrent - Distributed
  7. 7. 7 Виды параллелизма • На уровне операционной системы • На уровне одной программы / процесса
  8. 8. 8 Параллелизм — ОС • Слушать музыку и переписываться в фейсбуке в Одноклассниках • При зависании одной программы другие продолжают работать • и т.п.
  9. 9. 9 Преимущества параллелизма • Использование нескольких ядер/процессоров - Да и на 1 ядре тоже! (async I/O) • Простота моделирования - Абстракция: фреймворк забирает сложность
  10. 10. 10 Преимущества параллелизма • Использование нескольких ядер/процессоров - Да и на 1 ядре тоже! (async I/O) • Простота моделирования - Абстракция: фреймворк забирает сложность • Упрощенная обработка асинхронных событий • Более отзывчивые интерфейсы пользователя - Event Dispatch Thread (EDT), async calls
  11. 11. 11 Параллелизм на уровне отдельно взятой программы • Эффективное использование ресурсов • Удобство, простота написания кода • Справедливость - Обработка запросов пользователей на серверах социальной сети с одинаковым приоритетом - Читатели и писатели - Fairness (честность)
  12. 12. 12 Lock lock = new ReentrantLock(true);
  13. 13. 13 Честность! Lock lock = new ReentrantLock(true);
  14. 14. 14 Блокировки • java.util.concurrent — since Java 5 - Lock —> ReentrantLock - ReadWriteLock —> ReentrantReadWriteLock - StampedLock — since Java 8 • Synchronized method / section • wait() / notify() / notifyAll()
  15. 15. 15 Блокировки • java.util.concurrent — since Java 5 - Lock —> ReentrantLock - ReadWriteLock —> ReentrantReadWriteLock - StampedLock — since Java 8 • Synchronized method / section • wait() / notify() / notifyAll() Общее: ожидание
  16. 16. 16 Проблемы блокировок • Взаимоблокировки (Deadlocks) • Инверсия приоритетов • Надежность — вдруг владелец блокировки помрет? • Performance - Параллелизма в критической секции нет! - Владелец блокировки может быть вытеснен планировщиком
  17. 17. 17 Закон Амдала • α — часть общего объема вычислений, которую нельзя распараллелить • 1-α — часть, которую можно распараллелить • p — количество потоков
  18. 18. 18 Закон Амдала • α — часть общего объема вычислений, которую нельзя распараллелить • 1-α — часть, которую можно распараллелить • p — количество потоков
  19. 19. Неблокирующие алгоритмы
  20. 20. 20 Классификация • Без препятствий (Obstruction-Free) — поток совершает прогресс, если не встречает препятствий со стороны других потоков
  21. 21. 21 Классификация • Без препятствий (Obstruction-Free) — поток совершает прогресс, если не встречает препятствий со стороны других потоков • Без блокировок (Lock-Free) — гарантируется системный прогресс хотя бы одного потока
  22. 22. 22 Классификация • Без препятствий (Obstruction-Free) — поток совершает прогресс, если не встречает препятствий со стороны других потоков • Без блокировок (Lock-Free) — гарантируется системный прогресс хотя бы одного потока • Без ожидания (Wait-Free) — каждая операция выполняется за фиксированное число шагов, не зависящее от других потоков
  23. 23. 23 Сравнительная мощность примитивов Консенсусные числа различных операций • Операции на регистрах — 1 • Read-Modification-Write (RMW) — 2 - Common2 Class — коммутируют друг с другом или перезаписывают друг друга • Универсальные операции — ∞ - Сравнение с обменом (CAS) - Compare-And-Swap, Compare-And-Set
  24. 24. 24 Compare and Swap • Compare-and-swap (CAS) - IA32, x64 - SPARC • load-linked / store-conditional (LL/SC) - PowerPC - ARM
  25. 25. 25 Семантика CAS
  26. 26. 26 CAS Loop — типичный паттерн применения 1. Прочитать значение A из переменной V 2. Взять какое-то новое значение B для V 3. Использовать CAS для атомарного изменения V из A в B до тех пор, пока другие потоки меняют значение V во время этого процесса
  27. 27. 27 CAS Loop — типичный паттерн применения 1. Прочитать значение A из переменной V 2. Взять какое-то новое значение B для V 3. Использовать CAS для атомарного изменения V из A в B до тех пор, пока другие потоки меняют значение V во время этого процесса Атомарность Read-Modify-Write реализуется за счет постоянного мониторинга системы на предмет постороннего вмешательства
  28. 28. 28 Пример: неблокирующий счетчик
  29. 29. 29 Fast vs. slow path • Каждый блок кода может иметь, как минимум, два пути исполнения: короткий и длинный • Lock: contended vs. Uncontended • Uncontended Lock: - ≥ 1 CAS
  30. 30. 30 Недостатки CAS • CAS заставляет потоки, которые его вызывают, работать в условиях соревнования (contention) - Больше contention = больше бесполезных циклов процессора, трата процессорного времени • Написание корректных и быстрых алгоритмов на CAS требует специальной подготовки
  31. 31. Поддержка в Java
  32. 32. 32 Поддержка CAS в Java • В Java 5 появился JSR166 - пакет java.util.concurrent - пакет java.util.concurrent.atomic • На платформах, поддерживающих CAS, JIT-компилятор делает inline соответствующих машинных инструкций • Load Linked / Store Conditional
  33. 33. 33 Atomic variable classes • Scalars • Field updaters • Arrays • Compound variables • Accumulators - since Java 8
  34. 34. 34 Scalars • AtomicBoolean • AtomicInteger • AtomicLong • AtomicReference
  35. 35. 35 AtomicLong • boolean compareAndSet(int expect, int update) • long addAndGet(int delta) • long getAndAdd(int delta) • long getAndDecrement() • long getAndIncrement() • long incrementAndGet() • …
  36. 36. 36 AtomicLong • boolean compareAndSet(int expect, int update) • long addAndGet(int delta) • long getAndAdd(int delta) • long getAndDecrement() • long getAndIncrement() • long incrementAndGet() • …
  37. 37. 37 atomicInteger.getAndAdd(5) — Thanks, @AndreiPangin JDK 7u80 JDK 8u66 83 46 15 11 132 105 45 43 0 20 40 60 80 100 120 140 1 2 3 4 ops/μs threads
  38. 38. 38 JDK 7u80 — atomicLong.getAndAdd(5)
  39. 39. 39 JDK 8u66 — atomicLong.getAndAdd(5)
  40. 40. ХардкорЪ
  41. 41. 41 atomicLong.getAndAdd(5) loop: mov 0x10(%rbx),%rax mov %rax,%r11 add $0x5,%r11 lock cmpxchg %r11,0x10(%rbx) sete %r11b movzbl %r11b,%r11d test %r10d,%r10d je loop JDK 7u80 -XX:+PrintAssembly
  42. 42. 42 atomicLong.getAndAdd(5) lock addq $0x5, 0x10(%rbp)loop: mov 0x10(%rbx),%rax mov %rax,%r11 add $0x5,%r11 lock cmpxchg %r11,0x10(%rbx) sete %r11b movzbl %r11b,%r11d test %r10d,%r10d je loop JDK 7u80 -XX:+PrintAssembly JDK 8u60
  43. 43. 43 atomicLong.getAndAdd(5) lock addq $0x5, 0x10(%rbp)loop: mov 0x10(%rbx),%rax mov %rax,%r11 add $0x5,%r11 lock cmpxchg %r11,0x10(%rbx) sete %r11b movzbl %r11b,%r11d test %r10d,%r10d je loop JDK 7u80 -XX:+PrintAssembly JDK 8u60 83 46 15 11 132 105 45 43 1 2 3 4 ops/μs threads
  44. 44. 44 Multivariable Invariant
  45. 45. 45 Multivariable Invariant
  46. 46. 46 Field Updaters • AtomicIntegerFieldUpdater - Reflection-based updater for volatile int • AtomicLongFieldUpdater - Reflection-based updater for volatile long • AtomicReferenceFieldUpdater - Reflection-based updater for volatile object
  47. 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)
  48. 48. Demo. Legacy Volatile Counter
  49. 49. 49 AtomicLongFieldUpdater
  50. 50. 50 AtomicLongFieldUpdater
  51. 51. 51 AtomicArrays • AtomicIntegerArray • AtomicLongArray • AtomicReferenceArray
  52. 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) • …
  53. 53. 53 Compound Variables AtomicMarkableReference V compareAndSet( V expectedReference, V newReference, boolean expectedMark, boolean newMark) AtomicStampedReference boolean compareAndSet( V expectedReference, V newReference, int expectedStamp, int newStamp)
  54. 54. 54 Accumulators • DoubleAccumulator • DoubleAdder • LongAccumulator • LongAdder • (Striped64)
  55. 55. 55 LongAccumulator • void accumulate(long x) • long get() • long getThenReset() • Void reset()
  56. 56. 56 Неблокирующие алгоритмы • Алгоритм называется неблокирующим (nonblocking), если отказ или остановка любого потока не может привести к отказу или остановке любого другого потока 56
  57. 57. 57 Неблокирующие алгоритмы • Алгоритм называется неблокирующим (nonblocking), если отказ или остановка любого потока не может привести к отказу или остановке любого другого потока • Алгоритм называется свободным от блокировок (lock-free), если на каждом шаге какой-то поток выполняет работу (make progress) 57
  58. 58. 58 Неблокирующие алгоритмы • Алгоритм называется неблокирующим (nonblocking), если отказ или остановка любого потока не может привести к отказу или остановке любого другого потока • Алгоритм называется свободным от блокировок (lock-free), если на каждом шаге какой-то поток выполняет работу (make progress) 58 nonblocking и lock-free — это разные вещи! - Алгоритмы на CAS могут быть одновременно неблокирующими и свободными от блокировок
  59. 59. 59 Неблокирующие структуры данных • Стек • Очереди - Много разных алгоритмов - Michael and Scott, 1996 - Потоки помогают друг другу
  60. 60. Литература
  61. 61. 61
  62. 62. 62
  63. 63. 63
  64. 64. 64 DL и все-все-все http://altair.cs.oswego.edu/mailman/listinfo/co ncurrency-interest To post a message to all the list members, send email to concurrency-interest@cs.oswego.edu
  65. 65. 65 Много полезных видео
  66. 66. 66 https://bitbucket.org/23derevo/concurrency
  67. 67. Вопросы и ответы
  68. 68. 68 Development @ Odnoklassniki •Blog -http://habrahabr.ru/company/odnoklassniki •Open source -https://github.com/odnoklassniki •Career -http://v.ok.ru
  69. 69. Спасибо за внимание! @23derevo alexey@jugru.org alexey.fyodorov@corp.mail.ru
  • cvoronin

    Feb. 18, 2016
  • vasile00722

    Nov. 30, 2015
  • AlexanderShusherov1

    Nov. 27, 2015
  • ssserj

    Nov. 26, 2015
  • JaakkoKristoffer

    Nov. 26, 2015
  • alterrebe

    Nov. 26, 2015

Доклад про неблокирующую синхронизацию. Devclub @ Tallin, 25.11.2015

Vues

Nombre de vues

1 759

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

40

Actions

Téléchargements

14

Partages

0

Commentaires

0

Mentions J'aime

6

×