Процесс | Порядок захвата ресурсов | Порядок освобождения ресурсов |
A | S, R | |
B | T, S | |
C | T, R |
Последовательность:
Последовательность:
Здесь – захват потоком A ресурса R; – освобождение потоком A ресурсов R и S.
Вывод:
1) тупики возникают не при каждом исполнении;
2) аккуратным планированием можно избежать блокировок;
3) блокировки можно обнаружить;
Стратегии борьбы с блокировками
1. «Страусовый алгоритм»:
Допущение, что блокировки в системе можно игнорировать. Усилия, затраченные на преодоление блокировок, могут себя не оправдать.
2. Обнаружение и устранение:
Дать возможность произойти блокировке, обнаружить ее и предпринять действия для ее исправления.
Способы восстановления:
- принудительная выгрузка ресурса;
- восстановление через откат (прежде чем захватить ресурс, процесс сохраняет свое состояние (checkpoint, контрольная точка), в случае конфликта можно вернуться к сохраненному состоянию);
- выгрузить процесс целиком (если нет побочных эффектов (процесс не влияет на состояние системы)).
|
|
Обнаружение тупика в случае единственности ресурса каждого типа:
1) В текущем состоянии построить граф Холта;
2) Обнаружить на нем цикл по какому-либо алгоритму:
Процесс | Захват ресурса | Ждет ресурс |
A | R | S |
B | - | T |
C | - | S |
D | V | S, T |
E | T | V |
F | W | S |
G | V | U |
Алгоритм:
Выполняется для каждой вершины графа, в начале все ребра не маркированы.
1. Список посещенных вершин пустой, выбираем начальную вершину M.
2. M добавляем в список. Если M в списке есть, то обнаружен цикл.
3. Если у M имеется немаркированное исходящее ребро, то идем к шагу 4, иначе – к шагу 5.
4. Выбираем любое немаркированное ребро, маркируем его, переходим к новой вершине и объявляем её текущей; переходим к шагу 2.
5. Удаляем последнюю вершину из списка, выбираем ее текущей, переходим к шагу 3.
Обнаружение тупика, если имеется несколько ресурсов каждого типа:
(E 1, E 2, …, Em)= E – вектор ресурсов;
Ej - сколько ресурсов типа j (1 j m)
(A 1, A 2, …, Am)= A – вектор доступных ресурсов
Матрица текущего распределения ресурсов:
, где – сколько процесс i получил ресурсов типа j.
Матрица запросов ресурсов:
Алгоритм:
Все процессы не маркированы:
1) В матрице R ищем строку, соответствующую немаркированному процессу, которая меньше либо равна А, (ri A).
2) Если такая строка найдена, то маркируем процесс, прибавляем строку к вектору А, возвращаемся к шагу 1.
3) Если процессов нет, то конец.
Если находятся немаркированные процессы, то они в тупике.
Пример: Находится ли система в тупике?
E=(4, 2, 3, 1) A=(2, 1, 0, 0)