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

Preview:

Citation preview

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

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

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

3Concurrency

4Concurrency

5

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

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

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

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

6

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

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

7

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

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

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

9

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);

}}

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);

}

}

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

12

Кто такой lock

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

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

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

- освободить

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);

}

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);

}

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

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);

}

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

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

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

17

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

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

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

18

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

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

19

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

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

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

20

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

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

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

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

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

}

Deadlock

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

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

}

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

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

}

Теория

27

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

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

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

28

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

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

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

29

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

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

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

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

30

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

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

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

31

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

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

32

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

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

33

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

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

34

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

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

35

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

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

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

36

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

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

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

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

A

P

B

Q

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

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

A

P

B

Q

C

S

D

R

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

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

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

40 Найдите Deadlock

C S

F

R A

D

U

T

B

V

E

GW

41 Найдите Deadlock

C S

F

R A

D

U

T

B

V

E

GW

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

43

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

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

44

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

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

45

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

BirdStraush,1974

46

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

BirdStraush,1974до.н.э.

47

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

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

ЭтоОК? ?

48

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

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

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

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

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

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

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

50

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

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

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

51

52

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

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

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

53

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

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

54

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

I,scheduler

55

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

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

56

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

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

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

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

57

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

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

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

58

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

C

S

D

R

59

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

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

1

2 3

4

51

2

3

4

5C

S

D

R

60

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

1

2 3

4

5

61

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

3

1

2 3

4

51

2 4

5

Этоработает

63

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

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

64

291200

1

2 3

4

5170 2028000

10800

10

65

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

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

66

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

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

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

67

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

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

68

Livelock

69

Livelock

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

70

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

DR

71

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

D?

72

73

Решение

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

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

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

74

Решение

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

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

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

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

Литература

76Литература

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

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

@23derevoalexey.fyodorov@corp.mail.ru

Recommended