Upload
alexey-fyodorov
View
406
Download
2
Embed Size (px)
Citation preview
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)
� Простота моделирования: фреймворк забираетсложность
� Упрощеннаяобработкаасинхронных событий
� Болееотзывчивые интерфейсыпользователя
� EventDispatchThread(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;
}
Нет атомарности
CompareandSwap
int value = 0;
LOCKif (value == 0) {
value = 42;}
UNLOCK
Введемволшебнуюоперацию
int value = 0;
i.compareAndSet(0, 42);
CompareandSwap— HardwareSupport
compare-and-swapCAS
load-link / store-conditionalLL/SC
cmpxchg
ldrex/strex lwarx/stwcx
CASSemanticspublic 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, 1996https://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 (вставили_успешно) {пытаемся обновить tailreturn 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
OptimisticApproach
http://people.csail.mit.edu/edya/publications/OptimisticFIFOQueue-journal.pdf
Hoffman, Shalev, Shavit, 2007
BasketsQueue
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/
Вопросыиответы