Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,222 views

Published on

Современные процессоры имеют на борту по нескольку вычислительных ядер, позволяющих запускать задачи на них параллельно. И, казалось бы, вот оно — счастье: бей большие задачи на куски, запускай эти куски параллельно на разных ядрах и радуйся.

Но не все так просто. Для того чтобы одновременный доступ к общим данным выполнялся корректно, современные системы используют разные примитивы синхронизации. В основе одних лежат блокировки (locks), в основе других — операции типа сравнение-с-обменом (compare-and-swap). Однако и у тех и у других есть свои слабые места. О них мы и поговорим.

Из доклада вы узнаете, чем блокирующие алгоритмы отличаются от неблокирующих, и какими достоинствами и недостатками обладает каждый из этих классов. Кроме того, будут показаны различные подводные камни тех и других решений: Deadlock, Livelock, Starvation, Mutable vs Immutable hype.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Ангелы и демоны многопоточного программирования Алексей Федоров, Одноклассники
  2. 2. Зачем вы здесь?
  3. 3. 3 Concurrency
  4. 4. 4 Concurrency
  5. 5. 5 Чего не будет в презентации • Определений из учебника - Больше интересует сама концепция • Сравнения производительности • Советов, как правильно писать код • Холиваров* • Серебряных пуль, волшебных фреймворков и т.п. * Нет, ну если кто-то очень захочет, то можно, конечно…
  6. 6. 6 А что будет-то? • Пара простых многопоточных примеров • Куча связанных с ними проблем • Варианты решений - Которые, разумеется, не работают - Ну некоторые работают - Иногда - Наверное…
  7. 7. 7 Пререквизиты Нужно примерно понимать, что такое • процесс • поток / нить • синхронизация • блокировка • volatile
  8. 8. Пример. Банковские аккаунты
  9. 9. 9
  10. 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); } }
  11. 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); } } Какие тут есть проблемы в многопоточной среде?
  12. 12. 12 Кто такой lock • lock.lock - Вход в критическую секцию - свободно — взять - занято — ждать, пока освободится • lock.unlock - Выход из критической секции - освободить
  13. 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); }
  14. 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); } А тут в чем проблема?
  15. 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); } А тут в чем проблема?
  16. 16. Проблема обедающих философов Dijkstra, 1965 Hoare, 1985 Что это?
  17. 17. 17 • 5 философов по кругу – Тарелка с едой перед каждым – Вилки между тарелками • Каждый может – Размышлять – Брать соседнюю вилку – Есть (строго двумя вилками!) – Класть одну вилку Задача о философах
  18. 18. 18 Проблемы с обедающими философами Пусть каждый философ действует по некоторому алгоритму • Могут ли все философы умереть с голоду? • Можно ли составить такой алгоритм, чтобы все философы гарантированно не умерли с голоду?
  19. 19. 19 Параметры задачи • Количество философов • Есть ли возможность положить вилку, не пожрамши • Сколько времени философ ест - Фиксированное или случайная величина • Сколько времени философ размышляет • Какие ещё инструменты/элементы есть в системе? • Что ещё?
  20. 20. 20 Простое решение • Когда философ хочет есть, он делает следующие шаги: 1. Берёт левую от себя вилку 2. Берёт правую от себя вилку 3. Ест 4. Кладёт одну вилку 5. Кладёт другую вилку 6. Размышляет • И так по кругу
  21. 21. 21 Философы в коде while (true) { take(leftFork); take(rightFork); eat(); put(rightFork); put (leftFork); think(); }
  22. 22. Deadlock
  23. 23. 24 Философы в коде while (true) { take(leftFork); take(rightFork); eat(); put(rightFork); put (leftFork); think(); }
  24. 24. 25 Философы в коде while (true) { take(leftFork); take(rightFork); eat(); put(rightFork); put (leftFork); think(); }
  25. 25. Теория
  26. 26. 27 Ресурсы и взаимоблокировка Ресурс – объект, к которому предоставляется доступ Во время работы процесс может брать (захватывать) ресурсы
  27. 27. 28 Взаимоблокировка (Deadlock) Взаимоблокировка – такое состояние системы, при котором два или более процессов не могут продолжать своё выполнение из-за отсутствия необходимых для этого ресурсов. Каждый ждёт другого, поэтому никто не может продолжить
  28. 28. 29 Выгружаемые и невыгружаемые ресурсы • Выгружаемые ресурсы — ресурсы, которые могут быть безболезненно отобраны у процесса, который ими обладает • Невыгружаемые ресурсы — ресурсы, которые нельзя отобрать у процесса, не вызвав при этом сбой в вычислениях • Мы будем говорить, в основном, о невыгружаемых ресурсах
  29. 29. 30 Операции над невыгружаемыми ресурсами • Запрос ресурса - Берём ресурс - или ждём (встаём в «очередь» ожидания) • Использование ресурса • Освобождение ресурса
  30. 30. 31 Виды блокирующих запросов • без таймаута • с таймаутом • с исключением (ошибкой)
  31. 31. 32 Условия возникновения взаимоблокировок Коффман, 1971 1. Условие взаимного исключения 2. Условие удержания и ожидания 3. Условие невыгружаемости 4. Условие циклического ожидания
  32. 32. 33 Условие взаимного исключения Каждый ресурс либо выделен в данный момент только одному процессу, либо доступен для всех.
  33. 33. 34 Условие удержания и ожидания Процессы, удерживающие в данный момент ранее выделенные им ресурсы, могут запрашивать новые ресурсы.
  34. 34. 35 Условие невыгружаемости Ранее выделенные ресурсы не могут быть принудительно отобраны у процесса. Они должны быть явным образом высвобождены тем процессом, который их удерживает.
  35. 35. 36 Условие циклического ожидания Должна существовать кольцевая последовательность из двух и более процессов, каждый из которых ожидает высвобождения ресурса, удерживаемого следующим членом последовательности.
  36. 36. 37 Моделирование взаимоблокировок Ресурс занят Запрос ресурса A P B Q
  37. 37. 38 Моделирование взаимоблокировок Ресурс занят Запрос ресурса Взаимоблокировка A P B Q C S D R Граф ожидания (Holt, 1972)
  38. 38. 39 Условия возникновения взаимоблокировок — ещё раз Коффман, 1971 1. Условие взаимного исключения 2. Условие удержания и ожидания 3. Условие невыгружаемости 4. Условие циклического ожидания
  39. 39. 40 Найдите Deadlock C S F R A D U T B V E GW
  40. 40. 41 Найдите Deadlock C S F R A D U T B V E GW
  41. 41. Стратегии борьбы с блокировками
  42. 42. 43 Стратегии борьбы с блокировками • Игнорирование проблемы • Обнаружение и восстановление • Динамическое уклонение • Предотвращение за счёт подавления любого из четырёх условий Коффмана
  43. 43. 44 Кто использует стратегии борьбы? • Базы данных - Блокировки на строках, таблицах, индексах и т.д.
  44. 44. 45 Алгоритм Страуса Bird Straush, 1974
  45. 45. 46 Алгоритм Страуса Bird Straush, 1974 до. н.э.
  46. 46. 47 Алгоритм Страуса (Делаем вид, что проблема отсутствует) Это ОК? ?
  47. 47. 48 Алгоритм Страуса (Делаем вид, что проблема отсутствует) • Насколько часто возникает проблема? • Как часто возникают сбои в системе по другим причинам? • Насколько серьёзны могут быть последствия?
  48. 48. 49 Обнаружение взаимоблокировок и восстановление работоспособности • Шаги - Позволить блокировке произойти - Пытаться обнаружить момент возникновения - Попробовать восстановить работоспособность В нашем примере можно просто перезапускать философов
  49. 49. 50 Выход из взаимоблокировки • Приоритетный захват ресурсов - Приоритезировать (все) процессы - Отобрать ресурс у менее приоритетного процесса • Откат (см. след. слайд) • Уничтожение и перезапуск процессов
  50. 50. 51
  51. 51. 52 Выход из взаимоблокировки — Откат • Периодически создаются контрольные точки • При обнаружении блокировки происходит откат • При откате часть работы (которая была выполнена после прохождения последней контрольной точки) теряется • Пример: MS SQL Server - При взаимной блокировке двумя транзакциями друг друга выбирается одна из них («жертва»), которую сервер откатывает.
  52. 52. 53 Уклонение от взаимоблокировки • Алгоритм банкира (Дейкстра, 1965) • В основе — идея о траекториях
  53. 53. 54 • Алгоритм банкира (Дейкстра, 1965) • В основе — идея о траекториях I, scheduler
  54. 54. 55 Предотвращение взаимоблокировки • Атака условия взаимного исключения • Атака условия ожидания и удержания • Атака условия циклического ожидания • Атака условия невыгружаемости
  55. 55. 56 Атака условия взаимного исключения • Возможна редко — часто программа становится некорректной • Идея — убирать ненужные блокировки - Делать нужно осторожно, чтобы функциональность не страдала - Заменять на другие механизмы типа CAS
  56. 56. 57 Атака условия ожидания и удержания • Запрашивать ВСЕ необходимые ресурсы не в процессе работы, а до начала работы - Но не всегда ресурсы известны заранее • Вначале временно высвободить все удерживаемые ресурсы - атомарно?
  57. 57. 58 Атака условия циклического ожидания C S D R
  58. 58. 59 Атака условия циклического ожидания • Нумерация ресурсов! - Захватывать ресурсы только в порядке возрастания номеров 1 2 3 4 5 1 2 3 4 5 C S D R
  59. 59. 60 Вернемся к философам 1 2 3 4 5
  60. 60. 61 Пронумеруем философов и вилки 3 1 2 3 4 5 1 2 4 5
  61. 61. Это работает
  62. 62. 63 Пронумеровали вилки • Ура! Количество съеденного постоянно растет! - Значит ли это, что никто из философов не голодает?
  63. 63. 64 291200 1 2 3 4 5 170 2028000 10800 10
  64. 64. 65 Голодание (Starvation) • Голодание — ситуация, в которой поток, от которого ожидается прогресс, (практически) стоит на месте.
  65. 65. 66 Голодание (Starvation) • Голодание — ситуация, в которой поток, от которого ожидается прогресс, (практически) стоит на месте. • Заблуждение - Голодание может осуществиться, только если потоки с более высоким приоритетом постоянно берут ресурсы, которые нужны низкоприоритетному
  66. 66. 67 Атака условия невыгружаемости • Разрешить выгружать!
  67. 67. 68 Livelock
  68. 68. 69 Livelock • Система занята какой-то работой • При этом прогресса нет
  69. 69. 70 Распределенные блокировки DR
  70. 70. 71 Распределенные блокировки D ?
  71. 71. 72
  72. 72. 73 Решение • Думать головой • Не использовать блокировки там, где не нужно • Брать как можно позже • Отпускать как можно раньше • Использовать системы без блокировок (CAS etc.) • Но с ними есть свои проблемы
  73. 73. 74 Решение • Думать головой • Не использовать блокировки там, где не нужно • Брать как можно позже • Отпускать как можно раньше • Использовать системы без блокировок (CAS etc.) • Но с ними есть свои проблемы • В распределенной системе с несколькими дата – центрами блокировки — это огромная проблема
  74. 74. Литература
  75. 75. 76 Литература
  76. 76. Вопросы и ответы
  77. 77. Спасибо за внимание! @23derevo alexey.fyodorov@corp.mail.ru

×