Лекция 05. Тупики.ppt
- Количество слайдов: 51
Тупики
Тупик • Тупик (взаимоблокировка) – это такое состояние, когда некоторое множество процессов блокируют друга, ожидая события, связанного с освобождением ресурса. Причем вызвать это событие может только процесс из данного множества. Но так, как все процессы находятся в состоянии ожидания, то не один из них не сможет инициировать данное событие.
Пример тупика Процесс 2 Процесс 1
Системная тупиковая ситуация • Системная тупиковая ситуация или зависание системы является следствием того, что один или более процессов находятся в состоянии тупика.
Выгружаемые и невыгружаемые ресурсы • Выгружаемый ресурс можно безболезненно забирать у владеющего им процесса (например, память). • Невыгружаемый ресурс - это такой ресурс, который нельзя забрать от текущего владельца, не уничтожив результаты вычислений (например, компакт-диска в момент записи).
• Взаимоблокировки касаются невыгружаемых ресурсов. • Потенциальные тупиковые ситуации, в которые вовлечен противоположный вид ресурсов, обычно можно разрешить с помощью перераспределения ресурсов от одного процесса к другому.
Условия возникновения тупиков • 1. 2. 3. 4. • В 1971 г. Коффман, Элфик и Шошани сформулировали следующие условия для возникновения тупиков. Условие взаимоисключения (Mutual exclusion). Условие ожидания ресурсов (Hold and wait). Условие неперераспределяемости (No preemtion). Условие кругового ожидания (Circular wait). Для тупика необходимо выполнение всех четырех условий.
Условие взаимоисключения • Каждый ресурс выделен в точности одному процессу или доступен. Процессы требуют предоставления им монопольного управления ресурсами, которые им выделяются.
Условие ожидания ресурсов • Процессы удерживают за собой ресурсы, уже выделенные им, ожидая в то же время выделения дополнительных ресурсов (которые при этом обычно удерживаются другими процессами).
Условие неперераспределяемости • Ресурс, данный ранее, не может быть принудительно забран у процесса. Освобождены они могут быть только процессом, который их удерживает.
Условие кругового ожидания • Существует кольцевая цепь процессов, в которой каждый процесс ждет доступа к ресурсу, удерживаемому следующим членом последовательности.
Основные направления борьбы с тупиками • Полное игнорирование проблемы ("алгоритм страуса") • Обнаружение тупиков • Восстановление после тупиков • Предотвращение тупиков за счет тщательного выделения ресурсов или нарушения одного из условий возникновения тупиков.
Полное игнорирование проблемы ("алгоритм страуса") • Простейший подход - игнорировать проблему тупиков. • В большинстве своем реальные операционные системы не осуществляют борьбу с тупиками, поскольку ресурсов и так достаточно много.
Обнаружение тупиков
Обнаружение тупиков • Обнаружение тупиков (detection) подход, который допускает возникновение тупиков, определяет процессы и ресурсы, которые вовлечены в тупиковую ситуацию, и пытается вывести систему из нее.
Обнаружение тупиков при наличии одного ресурса каждого типа
Обнаружение тупиков при наличии одного ресурса каждого типа Процесс A занимает ресурс R и хочет получить ресурс S. Процесс B ничего не использует, но хочет получить ресурс T. Процесс C ничего не использует, но хочет получить ресурс S. Процесс D занимает ресурс U и хочет получить ресурсы S и T. Процесс E занимает ресурс T и хочет получить ресурс V. Процесс F занимает ресурс W и хочет получить ресурс S. Процесс G занимает ресурс V хочет получить ресурс U.
Алгоритм 1. Для каждого узла N в графе выполняются следующие пять шагов, где N является начальным узлом. 2. Задаем начальные условия: L - пустой список, все ребра не маркированы. 3. Текущий узел добавляем в конец списка L и проверяем количество появлений узла в списке. Если узел присутствует в двух местах, граф содержит цикл (записанный в список L) и работа алгоритма завершается. 4. Для заданного узла смотрим, выходит ли из него хотя бы одно немаркированное ребро. Если да, то переходим к шагу 5, если нет, то переходим к шагу 6. 5. Случайным образом выбираем любое немаркированное исходящее ребро и отмечаем его. Затем по нему переходим к новому текущему узлу и возвращаемся к шагу 3. 6. Теперь мы зашли в тупик. Удаляем последний узел из списка и возвращаемся к предыдущему узлу, то есть тому, который был текущим перед тупиковым узлом. Обозначаем его текущим узлом и возвращаемся к шагу 3. Если это первоначальный узел, граф не содержит циклов и алгоритм завершается.
Обнаружение тупиков при наличии одного ресурса каждого типа R A C S D F U W G B T E D V T U G Граф ресурсов (а); цикл, извлеченный из а (б) E V
Обнаружение взаимоблокировок при наличии нескольких ресурсов каждого типа
• • • Pj – j-й процесс, где (1 ≤ j ≤ n) E – вектор существующих ресурсов Ei – количество ресурсов класса i в системе, где (1 ≤ i ≤ m) m – число классов ресурсов A – вектор доступных ресурсов Ai – количество экземпляров ресурса i, доступных в текущий момент C – матрица текущего распределения R – матрица запросов Cij – это количество экземпляров ресурса j, которое занимает процесс Рi. Rij – это количество экземпляров ресурса j, которые хочет получить процесс Рi
Алгоритм Существующие ресурсы Доступные ресурсы Матрица текущего распределения Матрица запроса
Алгоритм • Алгоритм обнаружения взаимоблокировок основан на сравнении векторов. • Для двух векторов A и B выполняется A ≤ B тогда и только тогда, когда Ai ≤ Bi, для 1<i<m. • В исходном положении все процессы не маркированы. • По мере продвижения алгоритма на процессы будет ставиться отметка, служащая признаком того, что они могут закончить свою работу и, следовательно, не находятся в тупике. • После завершения алгоритма известно, что любой немаркированный процесс находится в тупиковой ситуации.
Алгоритм 1. Ищем немаркированный процесс Pi для которого i-я строка матрицы R меньше вектора A или равна ему. 2. Если такой процесс найден, прибавляем i-ю строку матрицы C к вектору A, маркируем процесс и возвращаемся к шагу 1. 3. Если таких процессов не существует, работа алгоритма заканчивается. Завершение алгоритма означает, что все немаркированные процессы, если такие есть, попали в тупик.
Процесс 1 Процесс 2 Процесс 3 Матрица запроса CD Ск ан ер ы ы тер от Пл ри ме ры Матрица текущего распределения Ст CD Ск ан ер ы ы тер от Пл Ст ри ме ры Пример
Когда нужно искать тупики? • Проверять систему при попытке запроса нового ресурса • Регулярно проверять систему через определенные промежутки времени • Проверять систему во время наименьшей загрузки процессора
Восстановление после тупиков
Восстановление после тупиков • Систему, оказавшуюся в тупике, можно вывести из него, нарушив одно из условий его существования. При этом существует вероятность, что несколько процессов частично или полностью потеряют результаты проделанной работы. • Сложность восстановления обусловлена рядом факторов: – в большинстве систем нет эффективных средств для приостановки процесса, вывода его из системы и возобновления впоследствии; – если даже такие средства есть, то их использование требует затрат и внимания оператора; – восстановление после серьезного тупика может потребовать много работы.
Восстановление при помощи перераспределения ресурсов • Некоторый процесс принудительно выводится из системы для последующего использования его ресурсов. • Для определения такого процесса обычно требуются усилия оператора. • Возможность забрать ресурс у процесса, дать его другому процессу и затем вернуть его назад без нанесения ущерба сильно зависит от природы ресурса. • Подобное восстановление часто трудно, если не невозможно.
Восстановление через откат назад • Это один из наиболее эффективных способов приостановки и возобновления. • Когда тупик обнаружен, видно какие ресурсы вовлечены в цикл кругового ожидания. • Чтобы осуществить восстановление, процесс, который владеет таким ресурсам, должен быть отброшен к моменту времени, предшествующему его запросу на этот ресурс. • Для того, чтобы такой механизм был возможен, необходимо, чтобы в системе были реализованы средства рестарта с контрольной точки. Там где эти средства не предусмотрены, их должны организовать разработчики прикладных программ.
Восстановление через ликвидацию одного из процессов • Грубый, но простейший способ устранить тупик - убить один или более процессов. • По возможности лучше убить тот процесс, который может быть без ущерба возвращен к началу.
Предотвращение тупиков
Две траектории ресурсов процессов B Принтер Плоттер u (Завершены оба процесса) I 8 I 7 I 6 t I 5 r s p q I 1 Принтер I 2 I 3 I 4 A Плоттер
Безопасные и небезопасные состояния • Состояние безопасно, если оно не находится в тупике и существует некоторый порядок планирования, при котором каждый процесс может работать до завершения, даже если все процессы вдруг захотят немедленно получить свое максимальное количество ресурсов.
Безопасные и небезопасные состояния • Небезопасное состояние само по себе тупиком не является. • В безопасном состоянии система может гарантировать, что все процессы закончат свою работу, а в небезопасном состоянии такой гарантии дать нельзя.
Пример Демонстрация того, что состояние «a» безопасно Свободно: 3 a Свободно: 1 b Свободно: 5 c Свободно: 0 d Max Имеет Max Имеет Пусть, в системе есть 10 экземпляров данного ресурса Свободно: 7 e
Пример Демонстрация того, что состояние «b» небезопасно Свободно: 3 a Свободно: 2 b Свободно: 0 c Max Имеет Пусть, в системе есть 10 экземпляров данного ресурса Свободно: 4 d
Предотвращения тупиков путем тщательного распределения ресурсов • Можно избежать тупиковой ситуации, если рациональным образом использовать ресурсы, придерживаясь определенных правил. Наиболее известен среди алгоритмов такого рода - алгоритм банкира, предложенный Дейкстрой.
Алгоритм банкира • Алгоритм банкира имитирует действия банкира, располагающего определенным источником капитала, выдающего ссуды и принимающего платежи. Алгоритм был предложен Дейкстрой. • Суть алгоритма: система удовлетворяет только те запросы, при которых ее состояние остается безопасным. Остальные запросы откладываются. • Недостатки: каждый процесс заранее должен указать максимальное количество ресурсов, которое ему понадобится и в каждый момент процесс должен захватывать только один ресурс. • Данный алгоритм на практике неприменим из-за его неэффективности, т. к. необходимость в пересчете возникает непрерывно, при каждом поступлении процесса в систему и его удалении для каждой разновидности ресурсов.
Алгоритм банкира для одного вида ресурсов Свободно: 10 a - безопасное Max Имеет Клиенты Пусть, в системе есть 10 единиц кредита. Свободно: 2 Свободно: 1 b - безопасное c - небезопасное
CD-ROM Плоттеры Сканеры НМД Процесс CD-ROM Сканеры Плоттеры НМД Процесс Алгоритм банкира для нескольких видов ресурсов E=(6342) – существующие ресурсы P=(5322) – занятые ресурсы A=(1020) – доступные ресурсы Распределенные ресурсы Ресурсы, которые еще нужны
Алгоритм банкира для нескольких видов ресурсов Алгоритм для проверки безопасности состояния системы. 1. Ищем в матрице R строку, соответствующую процессу, чьи неудовлетворенные потребности ресурсов меньше или равны вектору A. Если такой строки не существует, то система в конце концов попадет в тупик, так как ни один процесс не может проработать до успешного завершения. 2. Допускаем, что процесс, строку которого выбрали в пункте 1, запрашивает все необходимые ресурсы (гарантируется, что это возможно) и заканчивает работу. Отмечаем этот процесс как завершенный и прибавляем все его ресурсы к вектору A. 3. Повторяем шаги 1 и 2 до тех пор, пока или все процессы будут помечены как завершенные - и состояние в этом случае является безопасным, или произойдет взаимоблокировка - тогда состояние небезопасно.
Предотвращение тупиков за счет нарушения условий их возникновения • Предотвращение тупиков (prevention) подход, цель которого обеспечение условий, исключающих возможность возникновения тупиковой ситуации. • Чтобы предотвратить тупик, достаточно нарушить хотя бы одно необходимое условие.
Атака условия взаимного исключения • Если в системе нет ресурсов, отданных в единоличное пользование одному процессу, мы никогда не попадем в тупик. • Исключение условия взаимоисключения вполне естественно (например, для такого устройства, как накопитель на магнитной ленте, принтер при использовании спулинга).
Атака условия удержания и ожидания • Нарушая условие ожидания, процесс должен сразу запросить все ресурсы. • Эффективность системы при этом может значительно ухудшиться. • Первая проблема при этом подходе заключается в том, что многие процессы не знают, сколько ресурсов им понадобится, до тех пор, пока не начнут работу. • Вторая проблема состоит в том, что при этом методе ресурсы не будут использоваться оптимально.
Атака условия отсутствия принудительной выгрузки ресурса • Процесс, удерживающий ресурсы и получивший отказ на другие ресурсы, должен освободить все взятые ресурсы, и через некоторое время запросить их заново. • При этом процесс может потерять большую часть проделанной работы.
Атака условия циклического ожидания • Циклическое ожидание можно устранить несколькими способами. • Способ 1. Нужно следовать правилу, гласящему, что процессу дано право только на один ресурс в конкретный момент времени. Если нужен второй ресурс, процесс обязан освободить первый. • Способ 2. Ввести общую нумерацию всех ресурсов. Тогда действует правило: процессы могут запрашивать ресурс, когда хотят этого, но все запросы должны быть сделаны в соответствии с нумерацией ресурсов. Процесс может запросить сначала принтер, затем накопитель на магнитной ленте, но не может сначала потребовать плоттер, а затем принтер.
Тупики не ресурсного типа • Взаимоблокировки могут происходить в ситуациях, в которых ресурсы вообще не участвуют. • Например, при использовании семафоров, два процесса заблокировали друга: каждый ждет, когда другой выполнит некое действие.
Голодание • Голодание является проблемой, тесно связанной с взаимоблокировкой. • В динамических системах постоянно происходят запросы к ресурсам. Необходима некоторая политика принятия решений о том, когда, кто и какой ресурс получит. Эта политика хотя и кажется разумной, может привести к тому, что некоторые процессы никогда не получат требуемое, хотя они и не будут заблокированы.
Пример • • • Рассмотрим процесс предоставления принтера. Пусть система использует некоторый вид алгоритма, гарантирующий, что предоставление принтера процессу не приводит к взаимоблокировке. Предположим, что несколько процессов одновременно хотят воспользоваться принтером. Какой из них должен получить этот ресурс? Один возможный алгоритм предоставления ресурсов отдает принтер процессу с наименьшим файлом для печати. Рассмотрим, что произойдет в сильно загруженной системе, когда один из процессов должен распечатать огромный файл. Каждый раз, когда принтер освобождается, система выбирает процесс с наиболее коротким файлом. Если в системе есть постоянный поток процессов с небольшими файлами, принтер никогда не будет предоставлен процессу с огромным файлом. Процесс просто "умрет от голода" (будет отложен на неопределенный срок, несмотря на то, что даже не будет заблокирован).
Голодание • Голодания можно избежать, если использовать стратегию распределения ресурсов по принципу "первым пришел первым обслужен".
Лекция 05. Тупики.ppt