SlideShare una empresa de Scribd logo
1 de 53
Descargar para leer sin conexión
XII	международная	конференция
CEE-SECR	/	РАЗРАБОТКА	ПО
28	- 29 октября,	Москва
Алексей	Федоров
Помоги	ближнему,	или	
Как	потоки	помогают	друг	другу
Одноклассники
Много интересных докладов в других залах
Pokemon или	Big Data?
https://pixelastic.github.io/pokemonorbigdata/
vs.
Это доклад не про Big Data!
Про	что	этот	доклад
— Программирование
— Алгоритмы
— Многопоточность
Много интересных докладов в других залах
Новичкам в области
многопоточности
Sorry
Перейдите в другой зал
Про	что	этот	доклад
Новичкам в области
многопоточности
Sorry
Перейдите в другой зал
Новичкам в неблокирующей
синхронизации
Короткое введение
Про	что	этот	доклад
Новичкам в области
многопоточности
Sorry
Перейдите в другой зал
Новичкам в неблокирующей
синхронизации
Короткое введение
Продвинутым многопоточным
программистам
Поговорим о фишечках
неблокирующих алгоритмов
Про	что	этот	доклад
Модели
Модели
Модель	с	разделяемой	памятью
— Операции	на	атомарных	регистрах:	read,	write
— Удобно	программировать,	все	привыкли
Модель	с	передачей	сообщений
— Операции:	send,	onReceive
— Похожа	на	то,	как	реально	работает	железо
Преимущества параллелизма
— Использование	нескольких ядер/процессоров
— Да	и	на	1	ядре	тоже!	(async I/O)
— Простота моделирования: фреймворк забирает	сложность
— Упрощенная	обработка	асинхронных событий
— Более	отзывчивые интерфейсы	пользователя
— Event	Dispatch	Thread	(EDT),	async calls
— Взаимоблокировки (Deadlocks)
Проблемы	блокировок
— Взаимоблокировки (Deadlocks)
— Инверсия приоритетов
Проблемы	блокировок
— Взаимоблокировки (Deadlocks)
— Инверсия приоритетов
— Надежность — вдруг владелец блокировки помрет?
Проблемы	блокировок
Проблемы	блокировок
— Взаимоблокировки (Deadlocks)
— Инверсия приоритетов
— Надежность — вдруг владелец блокировки помрет?
— Performance
— Параллелизма в критической секции нет!
— Владелец блокировки может быть вытеснен планировщиком
Закон	Амдала
α часть общего объема вычислений,
которую нельзя распараллелить
1-α часть, которую можно распараллелить
p количество потоков
Sp=
𝟏
α#	
𝟏%α
𝐩
α часть общего объема вычислений,
которую нельзя распараллелить
1-α часть, которую можно распараллелить
p количество потоков
Закон	Амдала
Фундаментальные	законы	природы
— 19	век	— законы	Ньютона
Фундаментальные	законы	природы
— 19	век	— законы	Ньютона
— 20	век	— закон	Мура
— тактовые	частоты
— число	транзисторов
Фундаментальные	законы	природы
— 19	век	— законы	Ньютона
— 20	век	— закон	Мура
— тактовые	частоты
— число	транзисторов
— 21	век	— закон	Амдала
Фундаментальные	законы	природы
— 19	век	— законы	Ньютона
— 20	век	— закон	Мура
— тактовые	частоты
— число	транзисторов
— 21	век	— закон	Амдала
Нарушение закона	влечет за	собой	дисциплинарную,	
гражданско-правовую,	административную	или	
уголовную ответственность
If-Modify-Write
volatile int value = 0;
if (value == 0) {
value = 42;
}
Нет атомарности
Compare	and	Swap
int value = 0;
LOCK
if (value == 0) {
value = 42;
}
UNLOCK
Введем	волшебную	операцию
int value = 0;
i.compareAndSet(0, 42);
Compare	and	Swap	— Hardware	Support
compare-and-swap
CAS
load-link / store-conditional
LL/SC
cmpxchg
ldrex/strex lwarx/stwcx
CAS	Semantics
public class PseudoCAS {
private long value;
public synchronized long get() { return value; }
public synchronized long compareAndSwap(long expected, long newV) {
long oldValue = value;
if (oldValue == expected) {
value = newV;
}
return oldValue;
}
public synchronized boolean compareAndSet(long expected, long newV){
return expected == compareAndSwap(expected, newV);
}
}
Пример	1.	Многопоточный	счетчик
public class CasLoopCounter implements Counter {
private AtomicLong value = new AtomicLong();
public long get() {
return value.get();
}
public void increment() {
long v;
do {
v = value.get();
} while (value.compareAndSet(v, v + 1));
}
}
Недостатки	CAS
Contended CAS —> tons of useless CPU cycles
do {
v = value.get();
} while (value.compareAndSet(v, v + 1));
Написание быстрых и корректных алгоритмов на CAS
требует экспертизы
Michael and Scott, 1996
https://www.research.ibm.com/people/m/michael/podc-1996.pdf
Потоки помогают друг другу
Неблокирующая	очередь
public class LinkedQueue<E> {
private static class Node<E> {
final E item;
final AtomicReference<Node<E>> next;
public Node(E item, AtomicReference<Node<E>> next) {
this.item = item;
this.next = next;
}
}
private final Node<E> dummy = new Node<>(null, null);
private final AtomicReference<Node<E>> head = new AtomicReference<>(dummy);
private final AtomicReference<Node<E>> tail = new AtomicReference<>(dummy);
}
public class LinkedQueue<E> {
private static class Node<E> {
final E item;
final AtomicReference<Node<E>> next;
public Node(E item, AtomicReference<Node<E>> next) {
this.item = item;
this.next = next;
}
}
private final Node<E> dummy = new Node<>(null, null);
private final AtomicReference<Node<E>> head = new AtomicReference<>(dummy);
private final AtomicReference<Node<E>> tail = new AtomicReference<>(dummy);
}
tailhead
dummy 1 2
tailhead
dummy 1 2 3
tailhead
dummy 1 2 3
public boolean put(E item) {
Node<E> newNode = new Node<>(item, null);
while (true) {
Node<E> currentTail = tail.get();
Node<E> tailNext = currentTail.next.get();
if (currentTail == tail.get()) {
if (tailNext != null) { // промежуточное состояние
обновляем tail
} else {// Консистентное состояние!
Пытаемся добавить новую ноду
if (вставили_успешно) {
пытаемся обновить tail
return true;
}
}
}
}
}
public boolean put(E item) {
Node<E> newNode = new Node<>(item, null);
while (true) {
Node<E> currentTail = tail.get();
Node<E> tailNext = currentTail.next.get();
if (currentTail == tail.get()) {
if (tailNext != null) {
tail.compareAndSet(currentTail, tailNext);
} else {
if (currentTail.next.compareAndSet(null, newNode)) {
tail.compareAndSet(currentTail, newNode);
return true;
}
}
}
}
}
Модификации
Ladan-Mozes, Shavit, 2004, 2008
Идея:	избавиться	от	второго	CAS
Optimistic	Approach
http://people.csail.mit.edu/edya/publications/OptimisticFIFOQueue-journal.pdf
Hoffman, Shalev, Shavit, 2007
Baskets	Queue
http://people.csail.mit.edu/shanir/publications/Baskets%20Queue.pdf
Материалы
51
Литература
52
Материалы
• Nitsan Wakart — http://psy-lob-saw.blogspot.com/
• Алексей	Шипилёв — https://shipilev.net/
• Максим	Хижинский — https://habrahabr.ru/post/219201/
Вопросы	и	ответы

Más contenido relacionado

La actualidad más candente

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
Dmitry Tsitelov
 
JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 

La actualidad más candente (19)

Java 8. Thread pools
Java 8. Thread poolsJava 8. Thread pools
Java 8. Thread pools
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Java threads - part 2
Java threads - part 2Java threads - part 2
Java threads - part 2
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
 
Cloud Haskell. Александр Вершилов
Cloud Haskell. Александр ВершиловCloud Haskell. Александр Вершилов
Cloud Haskell. Александр Вершилов
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 

Destacado

150397343 ims-ems-guide
150397343 ims-ems-guide150397343 ims-ems-guide
150397343 ims-ems-guide
Usama Waly
 
OLUFOJUDE BABAJIDE OLAITAN Resume
OLUFOJUDE BABAJIDE OLAITAN ResumeOLUFOJUDE BABAJIDE OLAITAN Resume
OLUFOJUDE BABAJIDE OLAITAN Resume
Olufojude Babajide
 
Business Manager- 07-2000 to 06-2003
Business Manager- 07-2000 to 06-2003Business Manager- 07-2000 to 06-2003
Business Manager- 07-2000 to 06-2003
Michele Varga
 
Muscular physiology artifact
Muscular physiology artifactMuscular physiology artifact
Muscular physiology artifact
cw7923bn
 
PMO 3.0 - Next Gen Lean Model - Doug Floyd
PMO 3.0 - Next Gen Lean Model - Doug FloydPMO 3.0 - Next Gen Lean Model - Doug Floyd
PMO 3.0 - Next Gen Lean Model - Doug Floyd
dvfloyd
 
Principles of evolution
Principles of evolutionPrinciples of evolution
Principles of evolution
jjcorrea121
 

Destacado (12)

Creatividad y robots
Creatividad y robotsCreatividad y robots
Creatividad y robots
 
150397343 ims-ems-guide
150397343 ims-ems-guide150397343 ims-ems-guide
150397343 ims-ems-guide
 
OLUFOJUDE BABAJIDE OLAITAN Resume
OLUFOJUDE BABAJIDE OLAITAN ResumeOLUFOJUDE BABAJIDE OLAITAN Resume
OLUFOJUDE BABAJIDE OLAITAN Resume
 
Business Manager- 07-2000 to 06-2003
Business Manager- 07-2000 to 06-2003Business Manager- 07-2000 to 06-2003
Business Manager- 07-2000 to 06-2003
 
Microservices for test automation
Microservices for test automationMicroservices for test automation
Microservices for test automation
 
CustomerLetter2.PDF
CustomerLetter2.PDFCustomerLetter2.PDF
CustomerLetter2.PDF
 
Muscular physiology artifact
Muscular physiology artifactMuscular physiology artifact
Muscular physiology artifact
 
PMO 3.0 - Next Gen Lean Model - Doug Floyd
PMO 3.0 - Next Gen Lean Model - Doug FloydPMO 3.0 - Next Gen Lean Model - Doug Floyd
PMO 3.0 - Next Gen Lean Model - Doug Floyd
 
Principles of evolution
Principles of evolutionPrinciples of evolution
Principles of evolution
 
SHRM 2016 Holiday Schedules
SHRM 2016 Holiday SchedulesSHRM 2016 Holiday Schedules
SHRM 2016 Holiday Schedules
 
Project Manager Toolkit in Powerpoint & Excel
Project Manager Toolkit in Powerpoint & ExcelProject Manager Toolkit in Powerpoint & Excel
Project Manager Toolkit in Powerpoint & Excel
 
Business Process Management Training | By ex-Deloitte & McKinsey Consultants
Business Process Management Training | By ex-Deloitte & McKinsey ConsultantsBusiness Process Management Training | By ex-Deloitte & McKinsey Consultants
Business Process Management Training | By ex-Deloitte & McKinsey Consultants
 

Similar a Помоги ближнему, или Как потоки помогают друг другу

2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
Омские ИТ-субботники
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
beloslab
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
Elena Kotina
 
06 vasenin roganov siis_2013
06 vasenin roganov siis_201306 vasenin roganov siis_2013
06 vasenin roganov siis_2013
Marina_creautor
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
MERA_school
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 

Similar a Помоги ближнему, или Как потоки помогают друг другу (20)

Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
 
ECMAscript harmony
ECMAscript harmonyECMAscript harmony
ECMAscript harmony
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
Олег Антонян
Олег АнтонянОлег Антонян
Олег Антонян
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
06 vasenin roganov siis_2013
06 vasenin roganov siis_201306 vasenin roganov siis_2013
06 vasenin roganov siis_2013
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 

Más de Alexey Fyodorov

Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing world
Alexey Fyodorov
 

Más de Alexey Fyodorov (12)

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithm
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМС
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых Потоков
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!
 
Philosophers
PhilosophersPhilosophers
Philosophers
 
Java in Motion
Java in MotionJava in Motion
Java in Motion
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы Java
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing world
 

Помоги ближнему, или Как потоки помогают друг другу