Помоги ближнему, или Как потоки помогают друг другу
TRANSCRIPT
![Page 1: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/1.jpg)
XIIмеждународнаяконференцияCEE-SECR/РАЗРАБОТКАПО28- 29 октября,Москва
АлексейФедоров
Помогиближнему,илиКакпотокипомогаютдругдругу
Одноклассники
![Page 2: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/2.jpg)
Много интересных докладов в других залах
![Page 3: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/3.jpg)
![Page 4: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/4.jpg)
Pokemon илиBig Data?
https://pixelastic.github.io/pokemonorbigdata/
vs.
![Page 5: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/5.jpg)
![Page 6: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/6.jpg)
![Page 7: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/7.jpg)
![Page 8: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/8.jpg)
![Page 9: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/9.jpg)
![Page 10: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/10.jpg)
![Page 11: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/11.jpg)
Это доклад не про Big Data!
![Page 12: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/12.jpg)
Прочтоэтотдоклад� Программирование� Алгоритмы� Многопоточность
![Page 13: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/13.jpg)
Много интересных докладов в других залах
![Page 14: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/14.jpg)
Новичкам в области многопоточности
SorryПерейдите в другой зал
Прочтоэтотдоклад
![Page 15: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/15.jpg)
Новичкам в области многопоточности
SorryПерейдите в другой зал
Новичкам в неблокирующей синхронизации
Короткое введение
Прочтоэтотдоклад
![Page 16: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/16.jpg)
Новичкам в области многопоточности
SorryПерейдите в другой зал
Новичкам в неблокирующей синхронизации
Короткое введение
Продвинутым многопоточным программистам
Поговорим о фишечкахнеблокирующих алгоритмов
Прочтоэтотдоклад
![Page 17: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/17.jpg)
Модели
![Page 18: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/18.jpg)
Модели
Модельсразделяемойпамятью
� Операциинаатомарныхрегистрах:read,write
� Удобнопрограммировать,всепривыкли
Модельспередачейсообщений
� Операции:send,onReceive
� Похожанато,какреальноработаетжелезо
![Page 19: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/19.jpg)
Преимущества параллелизма
� Использованиенескольких ядер/процессоров
� Даина1ядретоже!(async I/O)
� Простота моделирования: фреймворк забираетсложность
� Упрощеннаяобработкаасинхронных событий
� Болееотзывчивые интерфейсыпользователя
� EventDispatchThread(EDT),async calls
![Page 20: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/20.jpg)
� Взаимоблокировки (Deadlocks)
Проблемыблокировок
![Page 21: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/21.jpg)
� Взаимоблокировки (Deadlocks)
� Инверсия приоритетов
Проблемыблокировок
![Page 22: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/22.jpg)
� Взаимоблокировки (Deadlocks)
� Инверсия приоритетов
� Надежность — вдруг владелец блокировки помрет?
Проблемыблокировок
![Page 23: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/23.jpg)
Проблемыблокировок� Взаимоблокировки (Deadlocks)
� Инверсия приоритетов
� Надежность — вдруг владелец блокировки помрет?
� Performance� Параллелизма в критической секции нет!� Владелец блокировки может быть вытеснен планировщиком
![Page 24: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/24.jpg)
ЗаконАмдалаα часть общего объема вычислений,
которую нельзя распараллелить
1-α часть, которую можно распараллелить
p количество потоков
![Page 25: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/25.jpg)
Sp=𝟏
α#𝟏%α𝐩
α часть общего объема вычислений, которую нельзя распараллелить
1-α часть, которую можно распараллелить
p количество потоков
ЗаконАмдала
![Page 26: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/26.jpg)
Фундаментальныезаконыприроды� 19век— законыНьютона
![Page 27: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/27.jpg)
Фундаментальныезаконыприроды� 19век— законыНьютона� 20век— законМура
� тактовыечастоты� числотранзисторов
![Page 28: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/28.jpg)
Фундаментальныезаконыприроды� 19век— законыНьютона� 20век— законМура
� тактовыечастоты� числотранзисторов
� 21век— законАмдала
![Page 29: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/29.jpg)
Фундаментальныезаконыприроды� 19век— законыНьютона� 20век— законМура
� тактовыечастоты� числотранзисторов
� 21век— законАмдала
Нарушение законавлечет засобойдисциплинарную,гражданско-правовую,административнуюилиуголовную ответственность
![Page 30: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/30.jpg)
If-Modify-Write
volatile int value = 0;
if (value == 0) {value = 42;
}
Нет атомарности
![Page 31: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/31.jpg)
CompareandSwap
int value = 0;
LOCKif (value == 0) {
value = 42;}
UNLOCK
![Page 32: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/32.jpg)
Введемволшебнуюоперацию
int value = 0;
i.compareAndSet(0, 42);
![Page 33: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/33.jpg)
CompareandSwap— HardwareSupport
compare-and-swapCAS
load-link / store-conditionalLL/SC
cmpxchg
ldrex/strex lwarx/stwcx
![Page 34: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/34.jpg)
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);
}}
![Page 35: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/35.jpg)
Пример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));
}
}
![Page 36: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/36.jpg)
НедостаткиCAS
Contended CAS —> tons of useless CPU cycles
do {v = value.get();
} while (value.compareAndSet(v, v + 1));
Написание быстрых и корректных алгоритмов на CAS требует экспертизы
![Page 37: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/37.jpg)
![Page 38: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/38.jpg)
![Page 39: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/39.jpg)
Michael and Scott, 1996https://www.research.ibm.com/people/m/michael/podc-1996.pdf
Потоки помогают друг другу
Неблокирующаяочередь
![Page 40: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/40.jpg)
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);
}
![Page 41: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/41.jpg)
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);
}
![Page 42: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/42.jpg)
tailhead
dummy 1 2
![Page 43: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/43.jpg)
tailhead
dummy 1 2 3
![Page 44: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/44.jpg)
tailhead
dummy 1 2 3
![Page 45: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/45.jpg)
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;
}}
}}
}
![Page 46: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/46.jpg)
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;
}}
}}
}
![Page 47: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/47.jpg)
Модификации
![Page 48: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/48.jpg)
Ladan-Mozes, Shavit, 2004, 2008Идея:избавитьсяотвторогоCAS
OptimisticApproach
http://people.csail.mit.edu/edya/publications/OptimisticFIFOQueue-journal.pdf
![Page 49: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/49.jpg)
Hoffman, Shalev, Shavit, 2007
BasketsQueue
http://people.csail.mit.edu/shanir/publications/Baskets%20Queue.pdf
![Page 50: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/50.jpg)
Материалы
![Page 51: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/51.jpg)
51
Литература
![Page 52: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/52.jpg)
52
Материалы
• Nitsan Wakart — http://psy-lob-saw.blogspot.com/• АлексейШипилёв — https://shipilev.net/• МаксимХижинский — https://habrahabr.ru/post/219201/
![Page 53: Помоги ближнему, или Как потоки помогают друг другу](https://reader034.vdocuments.net/reader034/viewer/2022042611/587ac37a1a28abc0478b755f/html5/thumbnails/53.jpg)
Вопросыиответы