Ангелы и демоны многопоточного программирования /...

78
Ангелы и демоны многопоточного программирования Алексей Федоров, Одноклассники

Upload: ontico

Post on 18-Feb-2017

1.046 views

Category:

Engineering


6 download

TRANSCRIPT

Page 1: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Ангелыидемонымногопоточногопрограммирования

АлексейФедоров,Одноклассники

Page 2: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Зачемвыздесь?

Page 3: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

3Concurrency

Page 4: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

4Concurrency

Page 5: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

5

Чего не будет в презентации

• Определенийизучебника- Большеинтересуетсамаконцепция

• Сравненияпроизводительности• Советов,какправильнописатькод• Холиваров*• Серебряныхпуль,волшебныхфреймворков ит.п.

*Нет,нуесликто-то оченьзахочет,томожно, конечно…

Page 6: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

6

А что будет-то?

• Парапростыхмногопоточныхпримеров• Кучасвязанныхснимипроблем• Вариантырешений- Которые,разумеется,неработают- Нунекоторыеработают- Иногда- Наверное…

Page 7: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

7

Пререквизиты

Нужнопримерно понимать,чтотакое• процесс• поток / нить• синхронизация• блокировка• volatile

Page 8: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Пример.Банковскиеаккаунты

Page 9: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

9

Page 10: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

10

public void transfer (Account from, Account to, int amount) {

if (from.get() < amount) {throw new RuntimeException();

} else { from.set(from.get() - amount);to.set(to.get() + amount);

}}

Page 11: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

11

public void transfer (Account from, Account to, int amount) {

if (from.get() < amount) {throw new RuntimeException();

} else { from.set(from.get() - amount);to.set(to.get() + amount);

}

}

Какиетутестьпроблемывмногопоточнойсреде?

Page 12: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

12

Кто такой lock

• lock.lock- Входвкритическуюсекцию

- свободно— взять- занято— ждать,покаосвободится

• lock.unlock- Выходизкритическойсекции

- освободить

Page 13: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

13

public void transfer (Account from, Account to, int amount) {

lock(bank);if (from.get() < amount) {

throw new RuntimeException();} else {

from.set(from.get() - amount);to.set(to.get() + amount);

}unlock(bank);

}

Page 14: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

14

public void transfer (Account from, Account to, int amount) {

lock(bank);if (from.get() < amount) {

throw new RuntimeException();} else {

from.set(from.get() - amount);to.set(to.get() + amount);

}unlock(bank);

}

Атутвчемпроблема?

Page 15: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

15

public void transfer (Account from, Account to, int amount) {

lock(from); lock(to);if (from.get() < amount) {

throw new RuntimeException();} else {

from.set(from.get() - amount);to.set(to.get() + amount);

}unlock(to); unlock(from);

}

Атутвчемпроблема?

Page 16: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Проблемаобедающихфилософов

Dijkstra,1965Hoare,1985Чтоэто?

Page 17: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

17

• 5философовпокругу– Тарелкаседойпередкаждым– Вилкимеждутарелками

• Каждыйможет– Размышлять– Братьсоседнюювилку– Есть(строгодвумявилками!)– Кластьоднувилку

Задача о философах

Page 18: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

18

Проблемы с обедающими философами

Пустькаждыйфилософдействуетпонекоторомуалгоритму• Могутливсефилософыумеретьсголоду?• Можнолисоставитьтакойалгоритм,чтобывсефилософыгарантированно неумерлисголоду?

Page 19: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

19

Параметры задачи

• Количествофилософов• Естьливозможностьположитьвилку,непожрамши• Скольковременифилософест- Фиксированноеилислучайнаявеличина

• Скольковременифилософразмышляет• Какиеещёинструменты/элементыестьвсистеме?• Чтоещё?

Page 20: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

20

Простое решение

• Когдафилософхочетесть,онделаетследующиешаги:1. Берётлевуюотсебявилку2. Берётправуюотсебявилку3. Ест4. Кладётоднувилку5. Кладётдругуювилку6. Размышляет

• Итакпокругу

Page 21: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

21Философы в коде

while (true) {take(leftFork);take(rightFork);eat();put(rightFork);put (leftFork);think();

}

Page 22: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Deadlock

Page 23: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)
Page 24: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

24Философы в коде

while (true) {take(leftFork);take(rightFork);eat();put(rightFork);put (leftFork);think();

}

Page 25: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

25Философы в коде

while (true) {take(leftFork);take(rightFork);eat();put(rightFork);put (leftFork);think();

}

Page 26: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Теория

Page 27: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

27

Ресурсы и взаимоблокировка

Ресурс – объект,ккоторомупредоставляетсядоступ

Вовремяработыпроцессможетбрать(захватывать)ресурсы

Page 28: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

28

Взаимоблокировка (Deadlock)

Взаимоблокировка – такоесостояниесистемы,прикоторомдваилиболеепроцессовнемогутпродолжатьсвоёвыполнениеиз-заотсутствиянеобходимыхдляэтогоресурсов.

Каждыйждётдругого,поэтомуниктонеможетпродолжить

Page 29: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

29

Выгружаемые и невыгружаемые ресурсы

• Выгружаемыересурсы— ресурсы,которыемогут бытьбезболезненноотобраныупроцесса,которыйимиобладает

• Невыгружаемыересурсы— ресурсы,которыенельзяотобратьупроцесса,невызвавприэтомсбойввычислениях

• Мыбудемговорить,восновном,оневыгружаемыхресурсах

Page 30: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

30

Операции над невыгружаемыми ресурсами

• Запросресурса- Берём ресурс- илиждём (встаёмв«очередь»ожидания)

• Использованиересурса• Освобождениересурса

Page 31: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

31

Виды блокирующих запросов

• безтаймаута• стаймаутом• сисключением(ошибкой)

Page 32: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

32

Условия возникновения взаимоблокировок

Коффман,19711. Условиевзаимногоисключения2. Условиеудержанияиожидания3. Условиеневыгружаемости4. Условиециклическогоожидания

Page 33: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

33

Условие взаимного исключения

Каждыйресурслибовыделенвданныймомент толькоодному процессу,либодоступен длявсех.

Page 34: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

34

Условие удержания и ожидания

Процессы,удерживающиевданныймоментранеевыделенныеимресурсы,могут запрашиватьновыересурсы.

Page 35: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

35

Условие невыгружаемости

Ранеевыделенныересурсынемогутбытьпринудительноотобраны упроцесса.

Онидолжныбытьявнымобразомвысвобожденытемпроцессом,которыйихудерживает.

Page 36: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

36

Условие циклического ожидания

Должнасуществоватькольцеваяпоследовательностьиздвухиболеепроцессов,каждыйизкоторыхожидаетвысвобожденияресурса,удерживаемогоследующимчленомпоследовательности.

Page 37: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

37 Моделирование взаимоблокировок

Ресурсзанят Запросресурса

A

P

B

Q

Page 38: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

38 Моделирование взаимоблокировок

Ресурсзанят Запросресурса Взаимоблокировка

A

P

B

Q

C

S

D

R

Графожидания(Holt,1972)

Page 39: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

39Условия возникновения взаимоблокировок — ещё раз

Коффман,19711. Условиевзаимногоисключения2. Условиеудержанияиожидания3. Условиеневыгружаемости4. Условиециклическогоожидания

Page 40: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

40 Найдите Deadlock

C S

F

R A

D

U

T

B

V

E

GW

Page 41: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

41 Найдите Deadlock

C S

F

R A

D

U

T

B

V

E

GW

Page 42: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Стратегииборьбысблокировками

Page 43: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

43

Стратегии борьбы с блокировками

• Игнорированиепроблемы• Обнаружениеивосстановление• Динамическоеуклонение• ПредотвращениезасчётподавлениялюбогоизчетырёхусловийКоффмана

Page 44: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

44

Кто использует стратегии борьбы?

• Базыданных- Блокировкинастроках,таблицах,индексахит.д.

Page 45: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

45

Алгоритм Страуса

BirdStraush,1974

Page 46: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

46

Алгоритм Страуса

BirdStraush,1974до.н.э.

Page 47: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

47

Алгоритм Страуса

(Делаемвид,чтопроблемаотсутствует)

ЭтоОК? ?

Page 48: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

48

Алгоритм Страуса

(Делаемвид,чтопроблемаотсутствует)

• Насколькочастовозникаетпроблема?• Какчастовозникаютсбоивсистемеподругимпричинам?

• Насколькосерьёзнымогутбытьпоследствия?

Page 49: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

49 Обнаружение взаимоблокировок и восстановление работоспособности

• Шаги- Позволить блокировкепроизойти- Пытатьсяобнаружить моментвозникновения- Попробоватьвосстановить работоспособность

Внашемпримереможнопростоперезапускатьфилософов

Page 50: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

50

Выход из взаимоблокировки

• Приоритетный захватресурсов- Приоритезировать (все)процессы- Отобратьресурсуменееприоритетногопроцесса

• Откат (см.след.слайд)• Уничтожениеиперезапуск процессов

Page 51: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

51

Page 52: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

52

Выход из взаимоблокировки — Откат

• Периодическисоздаютсяконтрольныеточки• Приобнаруженииблокировкипроисходитоткат• Приоткатечастьработы(котораябылавыполненапослепрохожденияпоследнейконтрольнойточки)теряется

• Пример:MSSQLServer- Привзаимнойблокировкедвумятранзакциямидругдругавыбираетсяоднаизних(«жертва»),которуюсервероткатывает.

Page 53: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

53

Уклонение от взаимоблокировки

• Алгоритмбанкира(Дейкстра,1965)• Воснове— идеяотраекториях

Page 54: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

54

• Алгоритмбанкира(Дейкстра,1965)• Воснове— идеяотраекториях

I,scheduler

Page 55: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

55

Предотвращение взаимоблокировки

• Атакаусловиявзаимногоисключения• Атакаусловияожиданияиудержания• Атакаусловияциклическогоожидания• Атакаусловияневыгружаемости

Page 56: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

56

Атака условия взаимного исключения

• Возможнаредко— частопрограммастановитсянекорректной

• Идея— убиратьненужныеблокировки- Делатьнужноосторожно,чтобыфункциональностьнестрадала

- Заменятьнадругиемеханизмы типаCAS

Page 57: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

57

Атака условия ожидания и удержания

• Запрашивать ВСЕнеобходимыересурсыневпроцессеработы,адоначалаработы- Ноневсегдаресурсыизвестнызаранее

• Вначалевременновысвободить всеудерживаемыересурсы- атомарно?

Page 58: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

58

Атака условия циклического ожидания

C

S

D

R

Page 59: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

59

Атака условия циклического ожидания

• Нумерацияресурсов!- Захватывать ресурсытольковпорядкевозрастанияномеров

1

2 3

4

51

2

3

4

5C

S

D

R

Page 60: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

60

Вернемся к философам

1

2 3

4

5

Page 61: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

61

Пронумеруем философов и вилки

3

1

2 3

4

51

2 4

5

Page 62: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Этоработает

Page 63: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

63

Пронумеровали вилки

• Ура!Количествосъеденногопостояннорастет!- Значитлиэто,чтониктоизфилософовнеголодает?

Page 64: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

64

291200

1

2 3

4

5170 2028000

10800

10

Page 65: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

65

Голодание (Starvation)

• Голодание— ситуация,вкоторойпоток,откоторогоожидаетсяпрогресс,(практически)стоитнаместе.

Page 66: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

66

Голодание (Starvation)

• Голодание— ситуация,вкоторойпоток,откоторогоожидаетсяпрогресс,(практически)стоитнаместе.

• Заблуждение- Голоданиеможетосуществиться,толькоеслипотокисболеевысокимприоритетомпостоянноберутресурсы,которыенужнынизкоприоритетному

Page 67: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

67

Атака условия невыгружаемости

• Разрешитьвыгружать!

Page 68: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

68

Livelock

Page 69: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

69

Livelock

• Системазанятакакой-тоработой• Приэтомпрогрессанет

Page 70: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

70

Распределенные блокировки

DR

Page 71: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

71

Распределенные блокировки

D?

Page 72: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

72

Page 73: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

73

Решение

• Думатьголовой• Неиспользоватьблокировкитам,гдененужно

• Братькакможнопозже• Отпускатькакможнораньше

• Использоватьсистемыбезблокировок (CASetc.)• Носнимиестьсвоипроблемы

Page 74: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

74

Решение

• Думатьголовой• Неиспользоватьблокировкитам,гдененужно

• Братькакможнопозже• Отпускатькакможнораньше

• Использоватьсистемыбезблокировок (CASetc.)• Носнимиестьсвоипроблемы• Враспределеннойсистемеснесколькимидата–

центрамиблокировки— этоогромнаяпроблема

Page 75: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Литература

Page 76: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

76Литература

Page 77: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Вопросыиответы

Page 78: Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассники)

Спасибозавнимание!

@[email protected]