Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
17.04.2013
Размер:
207.36 Кб
Скачать

7

СПО Лекция 11 [15.07.19]

Лекция 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 раз в год из-за тупика и 1 раз в день по какой-либо другой причине, то это правильное решение. Борьба с тупиками не дешева.

  2. Обнаружение тупика и последующее восстановление работоспособности системы.

  3. Предотвращение возможности возникновения тупика

  4. Обход тупика. Осторожное предоставление ресурсов таким образом, чтобы тупик не возник.

Обнаружение тупика и восстановление

Обнаружение тупика возможно на основе анализа циклов в графе распределения ресурсов.

Как быть с восстановлением?

(а) «Убить» один из процессов в циклической цепочке. Это не всегда возможно.

(б) Отменить ряд последних назначений ресурсов для устранения цикла.

В случае (б) процессы должны быть запрограммированы специальным образом, например, использовать технологию транзакций. Транзакция считается завершенной лишь в том случае, если выполнены все действия, входящие в транзакцию. Если транзакция не завершена, то она может быть повторена.

Предотвращение тупика

Направлено на нарушение одного из необходимых условий тупика. Как правило, навязывает некоторые соглашения или ограничения.

Взаимное исключение

  • Отказаться от разделяемых ресурсов, использовать полностью независимые нити.

  • Обеспечить «неограниченное» число совместно используемых ресурсов.

Неперераспределяемость ресурсов

  • Механизм аналогичен восстановлению (откат назад) на основе механизма транзакций

  • Автоматическое перераспределение. Возможно для некоторых типов ресурсов, например, для оперативной памяти возможна выгрузка на диск.

Ожидание с удерживанием

  • Запрашивать все необходимые ресурсы сразу и не начинать работу, пока запрос не будет удовлетворен. Как узнать сколько требуется?

  • Не разрешать удерживание ресурса бесконечно долго. Формировать отказ и освобождать занятый ресурс (можно отнести к предыдущей категории методов). Так, например, поступают телефонные компании – линия отключается.

Круговое ожидание

  • Нумеровать ресурсы и всегда запрашивать ресурсы в порядка возрастания номеров.

Обход тупика (алгоритм банкира)

Условия

  1. Распределяется конечное число ресурсов (возможно разных типов) между конечным и фиксированным числом нитей (процессов).

  2. Процессы заявляют о своих максимальных потребностях в ресурсах каждого типа.

  3. Процесс не может запрашивать больше, чем заявлено в максимальных потребностях.

  4. Занимать (освобождать) ресурсы можно как по одному, так и группами. Т.е. особых ограничений нет.

  5. Диспетчер ресурсов может отказать в предоставлении ресурса. Заметим, что это не может привести к бесконечному откладыванию в предоставлении ресурса.

  6. Процесс обязан вернуть выделенные ему ресурсы в течение конечного интервала времени.

Состояние считается надежным, если диспетчер ресурсов гарантирует всем процессам завершение в течение конечного времени.

Алгоритм банкира состоит в такой стратегии предоставления ресурсов, которая сохраняет надежное состояние системы распределения ресурсов.

Пример надежного состояния

Нить

Использует

Макс. потребность

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

Алгоритм (использует пометку строк, вначале все строки не помечены)

  1. Имитировать предоставление ресурса (A’,R’)

  2. Найти непомеченную строку i в матрице A’, такую что поэлементно i-я строка матрицы M-A’ меньше или равна вектору R’. Если нет такой строки, то состояние ненадежно. Завершить алгоритм.

  3. Вернуть ресурсы, занятые i-м процессом (пересчитать R’ добавив значения из i-ой строки матрицы A’ ). Пометить строку i.

  4. Если помечены все строки, то состояние надежно. Завершить алгоритм. Если есть непомеченные строки, то продолжить с п.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

Все строки помечены, состояние надежно. Можно удовлетворить запрос.

Недостатки:

  • Алгоритм применим лишь к фиксированному числу процессов и ресурсов.

  • Достаточно сложен, если запросы поступают очень часто.

Соседние файлы в папке вар1