Что такое дедлок
Что проверяют
Умеете ли вы отличать взаимную блокировку от обычного долгого ожидания и знаете ли, чем её ломают. Для работы с данными это не теория: дедлоки ловятся при параллельной загрузке в одну базу, в очередях между процессами и в загрузчиках обучающих данных, а выглядят одинаково: пайплайн просто висит без ошибок.
Как отвечать
Дедлок это состояние, когда участники циклически ждут ресурсы друг друга, и ни один не может продвинуться. Ключевое слово именно цикл: не просто ожидание, а замкнутая цепочка.
Полезно назвать четыре условия Коффмана: взаимное исключение, удержание ресурса с ожиданием следующего, невозможность отнять ресурс принудительно, циклическое ожидание. Дедлок возможен только когда выполнены все четыре, поэтому профилактика это сломать любое из них.
Практические приёмы: единый глобальный порядок захвата блокировок, захват одной крупной блокировки вместо двух мелких, таймауты на ожидание, короткие транзакции. В реляционных базах встроенный детектор сам снимает одну транзакцию с ошибкой, и задача приложения это повторить её целиком.
В пайплайнах данных стоит отдельно упомянуть ветвление процесса: дочерний процесс наследует мьютексы, захваченные чужими потоками родителя, и зависает на первом же логировании или обращении к пулу соединений. Отсюда классические зависания загрузчиков с несколькими воркерами, которые лечатся запуском процессов отдельным стартом интерпретатора.
Диагностика: дамп стеков всех потоков, системные представления с ожиданиями и блокировками, лог дедлоков самой базы.
Где спотыкаются
Называют дедлоком любое зависание. Голодание, живая блокировка и медленное ожидание одной длинной транзакции устроены иначе, и интервьюер обычно просит показать именно замкнутый цикл ожидания.
Из средств борьбы вспоминают только алгоритм банкира. В живых системах он почти не применяется, потому что требует заранее знать максимум ресурсов по каждому участнику. Реальные ответы это порядок захвата, таймаут и ретрай.
Повторяют упавшую транзакцию мгновенно и в том же порядке, воспроизводя ту же гонку. Ретрай нужен с паузой и случайным разбросом, а если дедлоки идут потоком, чинить надо порядок захвата, а не количество попыток.