СПО (Корнилов) / Лекции / вар1 / SPOLec11
.doc
Лекция 11. Тупики (DeadLock)
-
Условия возникновения тупиков
-
Обнаружение тупиков
-
Предотвращение тупиков
-
Обход тупиков
Условия возникновения тупиков
Тупики возникают в ситуациях, когда процесс пытается получить эксклюзивный доступ к ресурсам (устройствам, файлам, объектам ядра), т.е. везде где есть ожидание.
Различие между бесконечным откладыванием и тупиком:
-
Бесконечное откладывание, в принципе, может разрешиться.
-
Тупик, если возник, не может разрешиться без внешнего воздействия.
Пример
... ...
s1.P(); s2.P();
s2.P(); s1.P();
--- Возможен Тупик ---
В 1971 Коффман (Coffman) сформулировал следующие необходимые условия возникновения тупика:
-
Ограниченный (взаимоисключающий) доступ
-
Неперераспределяемость ресурсов (предоставленный ресурс нельзя забрать назад пока процесс сам не вернет)
-
Ожидание с удерживанием (ждем предоставления ресурса, не отдавая те, что успели захватить)
-
Круговое ожидание (ждем предоставление ресурса, выделенного другому процессу в цепочке)
Выполнение необходимых условий не означает, что тупик обязательно возникнет. Рассмотрим пример.
Нить А Нить В
1. Запрашивает X (Req.X) 1. Запрашивает Y (Req.Y)
2. Запрашивает Y (Req.Y) 2. Запрашивает X (Req.X)
3. Освобождает X (Rel.X) 3. Освобождает X (Rel.X)
4. Освобождает Y (Rel.Y) 4. Освобождает Y (Rel.Y)
Траектория A: B-Req.Y, A- Req.X, A- Req.Y, A- Rel.X, A- Rel.Y, B- Req.X, B- Rel.X, B- Rel.Y
Траектория B: B-Req.Y, A- Req.X, B- Req.X, B- Rel.X, A- Req.Y, B- Rel.Y, A- Rel.X, A- Rel.Y,
Траектория C: B-Req.Y, A- Req.X, B- Req.X,
1. Запрашивает X (Req.X) 1. Запрашивает Y (Req.Y)
2. Запрашивает Y (Req.Y) 2. Запрашивает X (Req.X)
3. Освобождает X (Rel.X) 3. Освобождает X (Rel.X)
4. Освобождает Y (Rel.Y) 4. Освобождает Y (Rel.Y)
Методы борьбы с тупиками
-
Алгоритм страуса (игнорировать). Если система виснет 1 раз в год из-за тупика и 1 раз в день по какой-либо другой причине, то это правильное решение. Борьба с тупиками не дешева.
-
Обнаружение тупика и последующее восстановление работоспособности системы.
-
Предотвращение возможности возникновения тупика
-
Обход тупика. Осторожное предоставление ресурсов таким образом, чтобы тупик не возник.
Обнаружение тупика и восстановление
Обнаружение тупика возможно на основе анализа циклов в графе распределения ресурсов.
Как быть с восстановлением?
(а) «Убить» один из процессов в циклической цепочке. Это не всегда возможно.
(б) Отменить ряд последних назначений ресурсов для устранения цикла.
В случае (б) процессы должны быть запрограммированы специальным образом, например, использовать технологию транзакций. Транзакция считается завершенной лишь в том случае, если выполнены все действия, входящие в транзакцию. Если транзакция не завершена, то она может быть повторена.
Предотвращение тупика
Направлено на нарушение одного из необходимых условий тупика. Как правило, навязывает некоторые соглашения или ограничения.
Взаимное исключение
-
Отказаться от разделяемых ресурсов, использовать полностью независимые нити.
-
Обеспечить «неограниченное» число совместно используемых ресурсов.
Неперераспределяемость ресурсов
-
Механизм аналогичен восстановлению (откат назад) на основе механизма транзакций
-
Автоматическое перераспределение. Возможно для некоторых типов ресурсов, например, для оперативной памяти возможна выгрузка на диск.
Ожидание с удерживанием
-
Запрашивать все необходимые ресурсы сразу и не начинать работу, пока запрос не будет удовлетворен. Как узнать сколько требуется?
-
Не разрешать удерживание ресурса бесконечно долго. Формировать отказ и освобождать занятый ресурс (можно отнести к предыдущей категории методов). Так, например, поступают телефонные компании – линия отключается.
Круговое ожидание
-
Нумеровать ресурсы и всегда запрашивать ресурсы в порядка возрастания номеров.
Обход тупика (алгоритм банкира)
Условия
-
Распределяется конечное число ресурсов (возможно разных типов) между конечным и фиксированным числом нитей (процессов).
-
Процессы заявляют о своих максимальных потребностях в ресурсах каждого типа.
-
Процесс не может запрашивать больше, чем заявлено в максимальных потребностях.
-
Занимать (освобождать) ресурсы можно как по одному, так и группами. Т.е. особых ограничений нет.
-
Диспетчер ресурсов может отказать в предоставлении ресурса. Заметим, что это не может привести к бесконечному откладыванию в предоставлении ресурса.
-
Процесс обязан вернуть выделенные ему ресурсы в течение конечного интервала времени.
Состояние считается надежным, если диспетчер ресурсов гарантирует всем процессам завершение в течение конечного времени.
Алгоритм банкира состоит в такой стратегии предоставления ресурсов, которая сохраняет надежное состояние системы распределения ресурсов.
Пример надежного состояния
-
Нить
Использует
Макс. потребность
A
1
5
B
1
6
C
2
4
D
4
7
Резерв: 2
Всего: 10
Существует последовательность предоставления ресурсов, которая гарантирует всем процессам завершение:
Отдаем 2 из резерва нити C. C получила все, обязана отдать, после чего резерв станет 4.
Отдаем 4 из резерва нити A. A получила все, обязана отдать, после чего резерв станет 5.
Отдаем 5 из резерва нити B. B получила все, обязана отдать, после чего резерв станет 6.
Отдаем 3 из резерва нити D. D получила все, обязана отдать. Все завершились.
Предположим, что нить A запрашивает 1 ресурса. Предположим, что мы удовлетворим этот запрос, тогда получим следующее состояние, которое не является надежным.
-
Нить
Использует
Макс. потребность
A
2
5
B
1
6
C
2
4
D
4
7
Резерв: 1
Всего: 10
В данном случае резерва недостаточно, чтобы гарантировать какой-либо нити завершение, если все нити действительно затребуют ресурсы по заявленному максимуму, то возникнет циклическая цепочка запросов.
Алгоритм банкира для ресурсов нескольких типов
Рассмотрим на примере для 5 нитей и ресурсов 4 типов.
Необходимые структуры данных:
Вектор исходных ресурсов (T): { 6 3 4 2 }
Матрица максимальных потребностей (M) R1 R2 R3 R4
A: 4 1 1 1
B: 0 2 1 2
C: 4 2 1 0
D: 1 1 1 1
E: 2 1 1 0
Матрица занятых ресурсов (A) R1 R2 R3 R4
A: 3 0 1 1
B: 0 1 0 0
C: 1 1 1 0
D: 1 1 0 1
E: 0 0 0 0
Вектор занятых ресурсов (P): { 5 3 2 2 }
Вектор свободных ресурсов (R=T-P): { 1 0 2 0 }
Матрица возможных запросов M-A
Алгоритм (использует пометку строк, вначале все строки не помечены)
-
Имитировать предоставление ресурса (A’,R’)
-
Найти непомеченную строку i в матрице A’, такую что поэлементно i-я строка матрицы M-A’ меньше или равна вектору R’. Если нет такой строки, то состояние ненадежно. Завершить алгоритм.
-
Вернуть ресурсы, занятые i-м процессом (пересчитать R’ добавив значения из i-ой строки матрицы A’ ). Пометить строку i.
-
Если помечены все строки, то состояние надежно. Завершить алгоритм. Если есть непомеченные строки, то продолжить с п.2.
Пример
Пусть нить B запрашивает 1 ресурса R3.
A’: R1 R2 R3 R4 M-A’: R1 R2 R3 R4
A: 3 0 1 1(-) A: 1 1 0 0 (-)
B: 0 1 1 0(-) B: 0 1 0 2 (-)
C: 1 1 1 0(-) C: 3 1 0 0 (-)
D: 1 1 0 1(-) D: 0 0 1 0 (-)
E: 0 0 0 0(-) E: 2 1 1 0 (-)
R’: 1 0 1 0
Можем завершить D. Возвращаем занятые ресурсы. Помечаем строку 4.
A’: R1 R2 R3 R4 M-A’: R1 R2 R3 R4
A: 3 0 1 1(-) A: 1 1 0 0 (-)
B: 0 1 1 0(-) B: 0 1 0 2 (-)
C: 1 1 1 0(-) C: 3 1 0 0 (-)
D: 1 1 0 1(+) D: 0 0 1 0 (+)
E: 0 0 0 0(-) E: 2 1 1 0 (-)
R’: 2 1 1 1
Можем завершить E. Возвращаем занятые ресурсы. Помечаем строку 5.
A’: R1 R2 R3 R4 M-A’: R1 R2 R3 R4
A: 3 0 1 1(-) A: 1 1 0 0 (-)
B: 0 1 1 0(-) B: 0 1 0 2 (-)
C: 1 1 1 0(-) C: 3 1 0 0 (-)
D: 1 1 0 1(+) D: 0 0 1 0 (+)
E: 0 0 0 0(+) E: 2 1 1 0 (+)
R’: 2 1 1 1
Можем завершить A. Возвращаем занятые ресурсы. Помечаем строку 1.
A’: R1 R2 R3 R4 M-A’: R1 R2 R3 R4
A: 3 0 1 1(+) A: 1 1 0 0 (+)
B: 0 1 1 0(-) B: 0 1 0 2 (-)
C: 1 1 1 0(-) C: 3 1 0 0 (-)
D: 1 1 0 1(+) D: 0 0 1 0 (+)
E: 0 0 0 0(+) E: 2 1 1 0 (+)
R’: 5 1 2 2
Можем завершить C. Возвращаем занятые ресурсы. Помечаем строку 3.
A’: R1 R2 R3 R4 M-A’: R1 R2 R3 R4
A: 3 0 1 1(+) A: 1 1 0 0 (+)
B: 0 1 1 0(-) B: 0 1 0 2 (-)
C: 1 1 1 0(+) C: 3 1 0 0 (+)
D: 1 1 0 1(+) D: 0 0 1 0 (+)
E: 0 0 0 0(+) E: 2 1 1 0 (+)
R’: 6 2 3 2
Можем завершить B. Возвращаем занятые ресурсы. Помечаем строку 2
Все строки помечены, состояние надежно. Можно удовлетворить запрос.
Недостатки:
-
Алгоритм применим лишь к фиксированному числу процессов и ресурсов.
-
Достаточно сложен, если запросы поступают очень часто.