Рассмотрите сценарий в ОС: четыре процесса и три ресурса, каждый процесс требует двух любых ресурсов одновременно — можно ли наступить визнок (deadlock)? Постройте граф выделения ресурсов, предложите алгоритмы предотвращения и восстановления, и обсудите практическую применимость каждого метода для многопользовательской серверной системы

27 Окт в 13:42
4 +1
0
Ответы
1
Короткий ответ: да, взаимоблокировка возможна.
1) Пример и граф выделения.
- У нас 444 процесса (P1,…,P4)(P_1,\dots,P_4)(P1 ,,P4 ) и 333 ресурса (R1,R2,R3)(R_1,R_2,R_3)(R1 ,R2 ,R3 ). Каждый процесс требует одновременно двух ресурсов.
- Возможная ситуация, приводящая к deadlock: P1P_1P1 захватил R1R_1R1 и ждёт R2R_2R2 ; P2P_2P2 захватил R2R_2R2 и ждёт R3R_3R3 ; P3P_3P3 захватил R3R_3R3 и ждёт R1R_1R1 ; P4P_4P4 ничего не захватил. Тогда циклическое ожидание между P1,P2,P3P_1,P_2,P_3P1 ,P2 ,P3 .
- Граф выделения (написано множеством ориентированных рёбер):
{R1→P1, P1→R2, R2→P2, P2→R3, R3→P3, P3→R1}. \{R_1\to P_1,\; P_1\to R_2,\; R_2\to P_2,\; P_2\to R_3,\; R_3\to P_3,\; P_3\to R_1\}.
{R1 P1 ,P1 R2 ,R2 P2 ,P2 R3 ,R3 P3 ,P3 R1 }.
Этот цикл свидетельствует о deadlock.
2) Алгоритмы предотвращения (кратко, с плюсами/минусами)
- Принудительный порядок ресурсов (lock ordering). Назначить всем ресурсам глобальный порядок и требовать захвата в возрастающем порядке (например, по индексам). + Простая и дешёвая реализация, исключает циклы. − Требует планирования порядка, снижает гибкость, сложен при динамических ресурсах.
- Запрос всех ресурсов одновременно (atomic allocation). Процесс запрашивает сразу две единицы; если не получится — не захватывает ничего и пробует позже. + Исключает hold-and-wait. − Может сильно снизить параллелизм и вызвать голодание.
- Алгоритм Банковского (Banker’s). Система проверяет, что после выдачи остаётся безопасное состояние. + Гарантирует отсутствие deadlock, позволяет гибкость. − Требует заранее известных максимальных потребностей и дорого по проверкам; редко применим в реальном сервере.
- Предотвращение hold-and-wait и/или допуска предэмуляции (preemption). Принудительно вытаскивать ресурсы у процессов. + Может избавить от deadlock. − Невозможно/дорого для нелёгковесных или небезопасных ресурсов (I/O, внешние соединения).
3) Обнаружение и восстановление
- Обнаружение: периодически строить граф и искать цикл (алгоритм обнаружения циклов; сложность примерно O(n+m)O(n+m)O(n+m), где nnn — число процессов, mmm — число рёбер). В многопользовательской системе можно делать scan по таймаутам/переполнениям.
- Восстановление:
- Принудительное убийство/перезапуск процессов по приоритету/возрасту до разрыва цикла. + Простая реализация. − Потеря работы, неудобно для пользователей.
- Отмены транзакций/rollback с сохранёнными контрольными точками. + Более корректно при транзакционной логике. − Требует поддержки checkpoint/undo.
- Принудительная принудительная отъёмка ресурса и перенос состояния. + Подходит для реплицируемых/идемпотентных операций. − Неприменимо к неотъемлемым ресурсам (аппаратному I/O).
- Практический подход часто: детекция + мягкое восстановление (таймауты, выбор «жертвы» по политике) вместо тяжёлых универсальных схем.
4) Практическая применимость для многопользовательской серверной системы
- Ресурс-порядок (lock ordering) — наиболее практичен для серверов: прост, эффективен, минимален overhead; требует проектирования API и соглашений о порядке захвата (рекомендуется).
- Try-lock + таймаут + backoff — тоже очень практичен: не требует глобальной информации, уменьшает шанс тупика, хорош для сетевых/конкурентных операций.
- Запрос всех ресурсов заранее — полезен, если операции короткие и редкие; иначе приводит к плохой пропускной способности.
- Банковский алгоритм — редко применяется в реальных многопользовательских серверах (требует знать максимальные потребности и высока вычислительная стоимость).
- Обнаружение + восстановление — используется как запасной механизм: логировать, детектировать циклы периодически, восстанавливать через rollback/убийство с учётом приоритетов. В реальных системах обычно комбинируют: профилактические меры (порядок, try-lock) + детекция/восстановление как крайнее средство.
Рекомендуемая практическая комбинация: ввести строгие соглашения о порядке блокировок (где возможно) + использовать неблокирующие попытки захвата с таймаутом и экспоненциальным backoff; держать механизм детекции/восстановления и политику выбора жертвы (kill/rollback) как резерв.
27 Окт в 14:32
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир