4
Блокировки
Задача: упорядочение конкурентного доступа
к разделяемым ресурсам
Механизм
перед обращением к данным процесс захватывает блокировку,
после обращения — освобождает
блокировки приводят к очередям
Альтернативы
многоверсионность — несколько версий данных
оптимистичные блокировки — процессы не блокируются,
но при неудачном стечении обстоятельств возникает ошибка
Блокировки используются, чтобы упорядочить конкурентный доступ
к разделяемым ресурсам.
Под конкурентным доступом понимается одновременный доступ
нескольких процессов. Сами процессы могут выполняться как
параллельно (если позволяет аппаратура), так и последовательно
в режиме разделения времени.
Блокировки не нужны, если нет конкуренции (одновременно к данным
обращается только один процесс) или если нет разделяемого ресурса
(например, общий буферный кеш нуждается в блокировках,
а локальный – нет).
Перед тем как обратиться к ресурсу, защищенному блокировкой,
процесс должен захватить эту блокировку. После того как ресурс
больше не нужен процессу, он освобождает блокировку, чтобы
ресурсом могли воспользоваться другие процессы.
Захват блокировки возможен не всегда: ресурс может оказаться уже
занятым кем-то другим. Тогда процесс либо встает в очередь ожидания,
либо повторяет попытку захвата блокировки через определенное
время. Так или иначе это приводит к тому, что процесс вынужден
простаивать в ожидании освобождения блокировки.
Иногда удается применить другие, неблокирующие, стратегии.
Например, в одноименном модуле мы обсуждали механизм
многоверсионности. Еще один пример – оптимистичные блокировки,
которые не блокируют процесс, но в случае неудачи приводят к ошибке.