
- •Алгоритмы
- •План
- •Литература
- •Необходимость
- •Пример: файл данных
- •Критические участки
- •Взаимоисключающий
- •Атомарные операции
- •Пример: вставка в
- •Синхронизация в системах с общей памятью
- •Атомарные операции с общей памятью
- •Блокировки
- •Захват и освобождение блокировок
- •Обеспечение атомарности с помощью блокировки
- •Предотвращение состояний конкуренции
- •Взаимоблокировка
- •Самоблокировка
- •Предотвращение
- •Еще раз о состоянии конкуренции
- •Спин-блокировки
- •Спин блокировка с атомарными операциями
- •Блокировки без атомарных операций
- •Свойства
- •Доказательство
- •Доказательство отсутствия бесконечного ожидания
- •Алгоритмы для N процессоров
- •Блокировка в состоянии конфликта
- •Эффективность блокировок
- •Спин-блокировки для реальных систем
- •Блокировки чтения-записи
- •Пример использования блокировки чтения-записи
- •Пример реализации rw блокировки
- •Отказ обслуживания записи при обслуживании чтения
- •Блокировки чтения-записи с приоритетом на запись
- •Использование секвентных блокировок
- •Реализация seqlock
- •Недостатки spinlock
- •Семафоры
- •Операции с семафорами
- •Mutex
- •Пример:
- •Счетный семафор
- •Реализация семафоров
- •Пример реализации семафора
- •Семафоры чтения записи
- •Особенности семафоров
- •Условные переменные
- •Пример использование
- •Мониторы
- •Барьер
- •Блокировки в системах с распределенной памятью
- •Пример реализации барьера
- •Вопросы?

Синхронизация в системах с общей памятью
Память общая –> возможность доступа к общим данным –> возможность конкуренции за ресурс
Очень часто необходима синхронизация доступа к данным
Удобство и скорость доступа к общим данным компенсируется необходимостью использования синхронизации

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

Блокировки
Блокировка – ресурс (переменная), который обеспечивает к себе взаимоисключающий доступ
Блокировки
Обязательные (mandatory) – при обращении к ресурсу блокировка захватывается обязательно
Рекомендуемые (advisory) – при обращении к ресурсу блокировка захватывается по желанию разработчика

Захват и освобождение блокировок
С блокировками возможны две операции
Захват
Освобождение
В захваченном состоянии блокировку может удерживать только один поток (процесс)
После освобождения блокировку снова можно захватывать

Обеспечение атомарности с помощью блокировки
lock – общая переменная |
lock – общая переменная |
List – общий связанный |
List - общий связанный |
список |
список |
Поток 1 |
Поток 2 |
Захватить(lock) |
Захватить(lock) |
Если захват успешный, то все остальные будут ждать захвата
Если захват успешный, то все остальные будут ждать захвата
|
Вставка (list) |
|
Удаление (list) |
|
Освободить(lock) |
|
Освободить(lock) |

Предотвращение состояний конкуренции
Доступ к совместно используемым ресурсам необходимо блокировать
В критических участках необходимо использовать блокировки
Блокировать необходимо данные, а не код!
Блокировки необходимо связывать с совместными данными

Взаимоблокировка
(deadlock)
Общие блокировки Lock_a, lock_b
Процесс 1 Захватить (lock_a) Захватить (lock_b)
Вечно ожидаем освобождения lock_b
lock_b не может быть освобождена, процесс 2 застрял на lock_a
Общие блокировки Lock_a, lock_b
Процесс 2 Захватить (lock_b) Захватить (lock_a)
Вечно ожидаем освобождения lock_a
lock_a не может быть освобождена, процесс 2 застрял на lock_b

Самоблокировка
Блокировка lock Процесс
Захватить (lock)
..
Захватить (lock)
Попытка захватить уже захваченную и никогда не освобождаемую блокировку приведет к зависанию

Предотвращение
взаимоблокировок
На каждую операцию захвата любой блокировки необходима операция освобождения
Разные блокировки в разных процессах необходимо захватывать в строго определенном порядке
Освобождать желательно в обратном порядке (хотя и не обязательно)

Еще раз о состоянии конкуренции
Лишняя операция освобождения может привести к состоянию конкуренции
Процесс
Захват()
…
Освобождение()
Освобождаем захваченную нами блокировку (ресурс свободен)
Освобождение()
Освобождаем захваченную кем-то другим блокировку
Предоставляем конкурентный доступ к ресурсу кому-то третьему