Что такое Deadlock?
Deadlock (взаимная блокировка) — это ситуация, при которой два или более процесса (или транзакции) ожидают ресурсы, удерживаемые друг другом, и в результате ни один из них не может продолжить работу. Система как бы «зависает»: каждый процесс ждёт, пока другой освободит ресурс, но никто этого не делает.
Deadlock может возникать в операционных системах, многопоточных программах и базах данных.
Пример из повседневной жизни
Представьте, что на узком мосту навстречу друг другу выехали две машины. Мост пропускает только одну машину. Каждый водитель ждёт, что другой сдаст назад, но никто не уступает. В итоге обе машины стоят на месте бесконечно. Это и есть deadlock.
Четыре условия deadlock (условия Коффмана)
Для возникновения deadlock одновременно должны выполняться четыре условия:
- Взаимное исключение (Mutual Exclusion): ресурс в каждый момент времени может использовать только один процесс. В примере с мостом — по мосту может проехать только одна машина.
- Удержание и ожидание (Hold and Wait): процесс удерживает уже полученный ресурс и одновременно ожидает другой.
- Отсутствие принудительного освобождения (No Preemption): ресурс нельзя принудительно отобрать у процесса — он должен освободить его сам.
- Циклическое ожидание (Circular Wait): процессы образуют замкнутую цепочку, в которой каждый ожидает ресурс, захваченный следующим.
Если нарушить хотя бы одно из этих условий, deadlock возникнуть не может. На этом принципе основаны все способы его предотвращения.
Простой пример
- Процесс A захватил Ресурс 1 и ожидает Ресурс 2.
- Процесс B захватил Ресурс 2 и ожидает Ресурс 1.
Ни A, ни B не могут продолжить работу, потому что каждый ждёт другого.
Deadlock в базе данных
В банковской системе одновременно выполняются два перевода:
- Транзакция 1: блокирует счёт Али, затем хочет записать данные на счёт Айтен.
- Транзакция 2: блокирует счёт Айтен, затем хочет записать данные на счёт Али.
Каждая транзакция ждёт строку, заблокированную другой. Современные базы данных, такие как MySQL и PostgreSQL, автоматически обнаруживают такую ситуацию и отменяют одну из транзакций (выбирают «жертву deadlock»), а другая продолжает работу. Отменённая транзакция в соответствии с принципами ACID полностью откатывается, поэтому данные не повреждаются. Программе достаточно просто повторить эту операцию.
Классическая задача: «Обедающие философы»
Самый известный пример, объясняющий deadlock, предложил нидерландский учёный Эдсгер Дейкстра. Пять философов сидят за круглым столом, между каждыми двумя лежит одна вилка. Чтобы поесть, каждому философу нужны две вилки. Если все одновременно возьмут левую вилку, каждый будет ждать правую — и никто не сможет поесть.
Способы борьбы с deadlock
1. Предотвращение (Prevention) — нарушение одного из четырёх условий:
- Упорядоченный доступ к ресурсам: если все процессы запрашивают ресурсы в одном и том же порядке, циклическое ожидание не возникает. В примере с банком: если транзакции всегда блокируют счета, например, в порядке возрастания номера счёта, deadlock не произойдёт.
- Запрос всех ресурсов сразу: процесс получает либо все нужные ресурсы сразу, либо ни одного.
2. Избегание (Avoidance) — перед выделением каждого ресурса система проверяет, безопасен ли такой запрос. Самый известный пример — «алгоритм банкира» Дейкстры.
3. Обнаружение и восстановление (Detection and Recovery) — система регулярно проверяет цепочки ожидания между процессами. При обнаружении deadlock она завершает один из процессов или отбирает у него ресурсы. Именно так поступают базы данных.
4. Тайм-аут (Timeout) — если процесс не может получить ресурс за определённое время, он отказывается от попытки и освобождает удерживаемые ресурсы.
Заключение
Deadlock — ситуация, которая может вызвать серьёзные проблемы в многопоточных и параллельных системах. Такие ошибки часто проявляются лишь при определённых условиях и редко, поэтому их относят к самым трудным для поиска багам. Поэтому риск deadlock нужно учитывать заранее при проектировании программ и SQL-запросов.
Хотите применить эти знания на практике и получить реальные результаты? Начните обучение на курсе «IT и Компьютерная инженерия» и шаг за шагом приобретайте практические навыки. Подробнее о курсе — перейдите по ссылке: Курс «IT и Компьютерная инженерия».
