Рассмотрите следующую ситуацию: три процесса P1,P2,P3 и два типа ресурсов R1(2 экземпляра), R2(1 экземпляр) со следующей матрицей выделения и запросов (Allocation/Request — придумайте реальные числа). Опишите метод обнаружения локальных взаимоблокировок (deadlocks) по алгоритму Банкера и графу ресурсов, покажите пример состояния взаимоблокировки и предложите стратегии предотвращения и восстановления
Приведу конкретный пример, покажу обнаружение deadlock по алгоритму Банкера и графу ресурсов, затем — стратегии предотвращения и восстановления. 1) Пример состояния (реальные числа) - Всего ресурсов: Total=(2,1)Total=(2,1)Total=(2,1) (R1 — 222 экземпляра, R2 — 111 экземпляр). - Матрица выделения (Allocation), строки — P1,P2,P3P1,P2,P3P1,P2,P3, столбцы — R1,R2R1,R2R1,R2: Allocation=(101001)
Allocation=\begin{pmatrix} 1 & 0\\ 1 & 0\\ 0 & 1 \end{pmatrix} Allocation=110001
(т.е. P1P1P1 держит (1,0)(1,0)(1,0), P2P2P2 — (1,0)(1,0)(1,0), P3P3P3 — (0,1)(0,1)(0,1)). - Матрица потребностей/запросов (Request/Need): Request=(010110)
Request=\begin{pmatrix} 0 & 1\\ 0 & 1\\ 1 & 0 \end{pmatrix} Request=001110
(т.е. P1P1P1 просит (0,1)(0,1)(0,1), P2P2P2 — (0,1)(0,1)(0,1), P3P3P3 — (1,0)(1,0)(1,0)). Вычислим Available: ∑Allocation=(2,1),Available=Total−∑Allocation=(2,1)−(2,1)=(0,0).
\sum Allocation=(2,1),\qquad Available=Total-\sum Allocation=(2,1)-(2,1)=(0,0). ∑Allocation=(2,1),Available=Total−∑Allocation=(2,1)−(2,1)=(0,0). 2) Обнаружение deadlock алгоритмом Банкера (без дальнейшего распределения) Алгоритм безопасности пытаетcя найти процесс с Need≤AvailableNeed\le AvailableNeed≤Available. Проверяем потребности: - P1P1P1: (0,1)≤(0,0) (0,1)\le(0,0)(0,1)≤(0,0)? — нет (1>0). - P2P2P2: (0,1)≤(0,0) (0,1)\le(0,0)(0,1)≤(0,0)? — нет. - P3P3P3: (1,0)≤(0,0) (1,0)\le(0,0)(1,0)≤(0,0)? — нет. Ни один процесс не может получить требуемые ресурсы, значит система небезопасна и в данном состоянии имеет взаимная блокировка (deadlock). 3) Обнаружение deadlock по графу ресурсов (Resource Allocation Graph) Построим RAG: - Узлы процессов: P1,P2,P3P1,P2,P3P1,P2,P3. - Узлы ресурсов: R1,R2R1,R2R1,R2 (R1 с двумя экземплярами). - Ребра выделения: R1→P1R1\to P1R1→P1, R1→P2R1\to P2R1→P2, R2→P3R2\to P3R2→P3. - Ребра запроса: P1→R2P1\to R2P1→R2, P2→R2P2\to R2P2→R2, P3→R1P3\to R1P3→R1. В графе есть цикл, например P1→R2→P3→R1→P1,
P1\to R2\to P3\to R1\to P1, P1→R2→P3→R1→P1,
(и аналогично через P2P2P2). Для одноэкземплярных ресурсов цикл deadlock; при нескольких экземплярах цикл — необходимое, но не всегда достаточное условие. В нашем примере цикл действительно соответствует deadlock (совпадает с выводом Банкера). 4) Пример восстановления из deadlock (конкретный шаг) Один из простых способов — принудительно завершить (абортировать) процесс. Допустим, убиваем P2P2P2, освобождается его выделение (1,0)(1,0)(1,0): Availablenew=(0,0)+(1,0)=(1,0).
Available_{new}=(0,0)+(1,0)=(1,0). Availablenew=(0,0)+(1,0)=(1,0).
Теперь P3P3P3 имеет Need (1,0)≤(1,0)(1,0)\le(1,0)(1,0)≤(1,0) — может продолжить, выполнится и освободит (0,1)(0,1)(0,1), тогда Available станет (1,1)(1,1)(1,1). После этого P1P1P1 (или P2P2P2 если бы не убили) сможет получить требуемые ресурсы и завершиться. Это один из вариантов восстановления; выбор процесса для убийства обычно делается по стоимости/приоритетам. 5) Стратегии предотвращения и восстановления (кратко) - Предотвращение: - Устранить одно из условий Coffman: - Запрет hold-and-wait: требовать, чтобы процесс запрашивал все ресурсы одновременно (one-shot) или освобождал удерживаемые перед новым запросом. - Ввести строгий порядок захвата ресурсов (маркировать ресурсы и требовать захватывать в возрастающем порядке) — предотвращает циклы. - Разрешить освобождение/преквизицию (preemption) — позволить отбирать ресурсы у процессов. - Ограничивать максимальные потребности (использовать Банкер заранее: запросы разрешать только если состояние останется безопасным). - Обнаружение + восстановление: - Периодически запускать детектор (Банкер требует известные максимумы) или анализ RAG; при обнаружении deadlock: - Преквизацияция (preempt) — отбирать ресурсы и откатывать процессы до безопасного состояния. - Убить (abort) минимальным набором процессов до устранения цикла (выбирать по стоимости/приоритету). - Откат (rollback) транзакций до контрольных точек. - Практические замечания: - Банкер применим, если процессы заранее объявляют свои максимальные требования. - Для многократных экземпляров RAG-цикл не всегда означает deadlock — нужно детализировать по количествам (Банкер или алгоритмы обнаружения со счетчиками). Вывод: в приведённом примере оба метода (Банкера и RAG) обнаруживают взаимоблокировку; предотвратить можно введением порядка захвата или отказом от hold-and-wait, восстанавливать — преквизацией, откатом или завершением процессов (с выбором по стоимости).
1) Пример состояния (реальные числа)
- Всего ресурсов: Total=(2,1)Total=(2,1)Total=(2,1) (R1 — 222 экземпляра, R2 — 111 экземпляр).
- Матрица выделения (Allocation), строки — P1,P2,P3P1,P2,P3P1,P2,P3, столбцы — R1,R2R1,R2R1,R2:
Allocation=(101001) Allocation=\begin{pmatrix}
1 & 0\\
1 & 0\\
0 & 1
\end{pmatrix}
Allocation= 110 001 (т.е. P1P1P1 держит (1,0)(1,0)(1,0), P2P2P2 — (1,0)(1,0)(1,0), P3P3P3 — (0,1)(0,1)(0,1)).
- Матрица потребностей/запросов (Request/Need):
Request=(010110) Request=\begin{pmatrix}
0 & 1\\
0 & 1\\
1 & 0
\end{pmatrix}
Request= 001 110 (т.е. P1P1P1 просит (0,1)(0,1)(0,1), P2P2P2 — (0,1)(0,1)(0,1), P3P3P3 — (1,0)(1,0)(1,0)).
Вычислим Available:
∑Allocation=(2,1),Available=Total−∑Allocation=(2,1)−(2,1)=(0,0). \sum Allocation=(2,1),\qquad Available=Total-\sum Allocation=(2,1)-(2,1)=(0,0).
∑Allocation=(2,1),Available=Total−∑Allocation=(2,1)−(2,1)=(0,0).
2) Обнаружение deadlock алгоритмом Банкера (без дальнейшего распределения)
Алгоритм безопасности пытаетcя найти процесс с Need≤AvailableNeed\le AvailableNeed≤Available.
Проверяем потребности:
- P1P1P1: (0,1)≤(0,0) (0,1)\le(0,0)(0,1)≤(0,0)? — нет (1>0).
- P2P2P2: (0,1)≤(0,0) (0,1)\le(0,0)(0,1)≤(0,0)? — нет.
- P3P3P3: (1,0)≤(0,0) (1,0)\le(0,0)(1,0)≤(0,0)? — нет.
Ни один процесс не может получить требуемые ресурсы, значит система небезопасна и в данном состоянии имеет взаимная блокировка (deadlock).
3) Обнаружение deadlock по графу ресурсов (Resource Allocation Graph)
Построим RAG:
- Узлы процессов: P1,P2,P3P1,P2,P3P1,P2,P3.
- Узлы ресурсов: R1,R2R1,R2R1,R2 (R1 с двумя экземплярами).
- Ребра выделения: R1→P1R1\to P1R1→P1, R1→P2R1\to P2R1→P2, R2→P3R2\to P3R2→P3.
- Ребра запроса: P1→R2P1\to R2P1→R2, P2→R2P2\to R2P2→R2, P3→R1P3\to R1P3→R1.
В графе есть цикл, например
P1→R2→P3→R1→P1, P1\to R2\to P3\to R1\to P1,
P1→R2→P3→R1→P1, (и аналогично через P2P2P2). Для одноэкземплярных ресурсов цикл deadlock; при нескольких экземплярах цикл — необходимое, но не всегда достаточное условие. В нашем примере цикл действительно соответствует deadlock (совпадает с выводом Банкера).
4) Пример восстановления из deadlock (конкретный шаг)
Один из простых способов — принудительно завершить (абортировать) процесс. Допустим, убиваем P2P2P2, освобождается его выделение (1,0)(1,0)(1,0):
Availablenew=(0,0)+(1,0)=(1,0). Available_{new}=(0,0)+(1,0)=(1,0).
Availablenew =(0,0)+(1,0)=(1,0). Теперь P3P3P3 имеет Need (1,0)≤(1,0)(1,0)\le(1,0)(1,0)≤(1,0) — может продолжить, выполнится и освободит (0,1)(0,1)(0,1), тогда Available станет (1,1)(1,1)(1,1). После этого P1P1P1 (или P2P2P2 если бы не убили) сможет получить требуемые ресурсы и завершиться. Это один из вариантов восстановления; выбор процесса для убийства обычно делается по стоимости/приоритетам.
5) Стратегии предотвращения и восстановления (кратко)
- Предотвращение:
- Устранить одно из условий Coffman:
- Запрет hold-and-wait: требовать, чтобы процесс запрашивал все ресурсы одновременно (one-shot) или освобождал удерживаемые перед новым запросом.
- Ввести строгий порядок захвата ресурсов (маркировать ресурсы и требовать захватывать в возрастающем порядке) — предотвращает циклы.
- Разрешить освобождение/преквизицию (preemption) — позволить отбирать ресурсы у процессов.
- Ограничивать максимальные потребности (использовать Банкер заранее: запросы разрешать только если состояние останется безопасным).
- Обнаружение + восстановление:
- Периодически запускать детектор (Банкер требует известные максимумы) или анализ RAG; при обнаружении deadlock:
- Преквизацияция (preempt) — отбирать ресурсы и откатывать процессы до безопасного состояния.
- Убить (abort) минимальным набором процессов до устранения цикла (выбирать по стоимости/приоритету).
- Откат (rollback) транзакций до контрольных точек.
- Практические замечания:
- Банкер применим, если процессы заранее объявляют свои максимальные требования.
- Для многократных экземпляров RAG-цикл не всегда означает deadlock — нужно детализировать по количествам (Банкер или алгоритмы обнаружения со счетчиками).
Вывод: в приведённом примере оба метода (Банкера и RAG) обнаруживают взаимоблокировку; предотвратить можно введением порядка захвата или отказом от hold-and-wait, восстанавливать — преквизацией, откатом или завершением процессов (с выбором по стоимости).