8. 8
Параллелизм — ОС
• Слушать музыку и переписываться в фейсбуке
в Одноклассниках
• При зависании одной программы другие
продолжают работать
• и т.п.
10. 10
Преимущества параллелизма
• Использование нескольких ядер/процессоров
- Да и на 1 ядре тоже! (async I/O)
• Простота моделирования
- Абстракция: фреймворк забирает сложность
• Упрощенная обработка асинхронных событий
• Более отзывчивые интерфейсы пользователя
- Event Dispatch Thread (EDT), async calls
11. 11
Параллелизм на уровне
отдельно взятой программы
• Эффективное использование ресурсов
• Удобство, простота написания кода
• Справедливость
- Обработка запросов пользователей на серверах
социальной сети с одинаковым приоритетом
- Читатели и писатели
- Fairness (честность)
16. 16
Проблемы блокировок
• Взаимоблокировки (Deadlocks)
• Инверсия приоритетов
• Надежность — вдруг владелец блокировки
помрет?
• Performance
- Параллелизма в критической секции нет!
- Владелец блокировки может быть вытеснен
планировщиком
17. 17
Закон Амдала
• α — часть общего объема вычислений,
которую нельзя распараллелить
• 1-α — часть, которую можно
распараллелить
• p — количество потоков
18. 18
Закон Амдала
• α — часть общего объема вычислений,
которую нельзя распараллелить
• 1-α — часть, которую можно
распараллелить
• p — количество потоков
23. 23
Сравнительная мощность примитивов
Консенсусные числа различных операций
• Операции на регистрах — 1
• Read-Modification-Write (RMW) — 2
- Common2 Class — коммутируют друг с
другом или перезаписывают друг друга
• Универсальные операции — ∞
- Сравнение с обменом (CAS)
- Compare-And-Swap, Compare-And-Set
26. 26
CAS Loop — типичный паттерн применения
1. Прочитать значение A из переменной V
2. Взять какое-то новое значение B для V
3. Использовать CAS для атомарного изменения V
из A в B до тех пор, пока другие потоки меняют
значение V во время этого процесса
27. 27
CAS Loop — типичный паттерн применения
1. Прочитать значение A из переменной V
2. Взять какое-то новое значение B для V
3. Использовать CAS для атомарного изменения V
из A в B до тех пор, пока другие потоки меняют
значение V во время этого процесса
Атомарность Read-Modify-Write реализуется за счет
постоянного мониторинга системы на предмет
постороннего вмешательства
29. 29
Fast vs. slow path
• Каждый блок кода может иметь, как минимум,
два пути исполнения: короткий и длинный
• Lock: contended vs. Uncontended
• Uncontended Lock:
- ≥ 1 CAS
32. 32
Поддержка CAS в Java
• В Java 5 появился JSR166
- пакет java.util.concurrent
- пакет java.util.concurrent.atomic
• На платформах, поддерживающих CAS, JIT-компилятор
делает inline соответствующих машинных инструкций
• Load Linked / Store Conditional
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
AtomicLong
• boolean compareAndSet(int expect, int
update)
• long addAndGet(int delta)
• long getAndAdd(int delta)
• long getAndDecrement()
• long getAndIncrement()
• long incrementAndGet()
• …
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
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)
• …