Tema_2_Lektsia_6.pptx
- Количество слайдов: 33
ЮУр. ГУ Международный факультет Кафедра международного менеджмента Дисциплина: Операционные системы
Тема 2 Вычислительный процесс и его реализация с помощью операционной системы Лекция 6 Тупики (взаимоблокировки) 1. Условия возникновения тупиков 2. Основные направления борьбы с тупиками 3. Обнаружение тупиков и восстановление после тупиков
1. Условия возникновения тупиков
Пример взаимоблокировки Взаимоблокировка возможна Взаимоблокировка произошла Четыре автомобиля должны одновременно пересечь перекресток. У всех помеха справа. Конфликт за ресурсы, которые представляют квадранты 1, 2, 3, 4. Когда автомобили осторожно заедут на перекресток, каждый захватит один ресурс (квадрант) и все останутся на вечной стоянке.
Пример взаимоблокировки Доступная память 200 Кбайт, взаимоблокировка возникнет, когда процессы дойдут до своего второго запроса.
Пусть несколько процессов конкурируют за обладание конечным числом ресурсов или сообщаются друг с другом. Если запрашиваемый процессом ресурс недоступен, ОС переводит данный процесс в состояние ожидания. В случае когда требуемый ресурс удерживается другим ожидающим процессом, первый процесс не сможет сменить свое состояние. Такая ситуация называется тупиком (deadlock – дословно «мертвые объятия» ). В мультипрограммной системе процесс находится в состоянии тупика, если он ожидает события, которое никогда не произойдет. Системная тупиковая ситуация, или «зависание системы» , является следствием того, что один или более процессов находятся в состоянии тупика. Иногда подобные ситуации называют взаимоблокировками. В общем случае проблема тупиков эффективного решения не имеет. Пример циклического ожидания Предположим, что два процесса осуществляют вывод с ленты на принтер. Один из них успел монополизировать ленту и претендует на принтер, а другой наоборот. После этого оба процесса оказываются заблокированными в ожидании второго ресурса. Множество процессов находится в тупиковой ситуации, если каждый процесс из множества ожидает события, которое может вызвать только другой процесс данного множества. Так как все процессы чего-то ожидают, то ни один из них не сможет инициировать событие, которое разбудило бы другого члена множества и, следовательно, все процессы будут спать вместе. При этом предполагается, что у процессов есть только один поток, а прерывания, способные возобновить работу заблокированного процесса, отсутствуют. Количество процессов и количество и вид удерживаемых и запрашиваемых ресурсов не имеет значения.
Пример взаимоблокировки (модель с траекторией ресурсов) Выполнение P Ось X – выполнение процесса Q, ось Y – выполнение процесса P. Два процесса (Q и P) конфликтуют за ресурсы A и B. Возникновение блокировки зависит от динамики выполнения процессов и от подробностей приложения. При путях выполнения процессов 1, 2, 5, 6 взаимоблокировка не возникает, при 3 и 4 – неизбежна.
Пример отсутствия взаимоблокировки (модель с траекторией ресурсов) Выполнение P Процесс P не требует двух ресурсов одновременно, поэтому независимо от того, каким образом процессы выполняются друг относительно друга, взаимоблокировка невозможна.
Тупики ресурсного типа Ресурсами могут быть как устройства, так и данные. Некоторые ресурсы допускают разделение между процессами, то есть являются разделяемыми (выгружаемыми) ресурсами. Например, память, процессор, жесткие диски, файлы, базы данных коллективно используются процессами. Другие не допускают разделения, то есть являются выделенными (невыгружаемыми), например лентопротяжное устройство, пишущий привод компакт-дисков. К взаимоблокировке может привести использование как выделенных, так и разделяемых ресурсов. Ресурсы могут также быть повторно используемыми (reusable), т. е. ресурсы используются процессами, и при этом не истощаются - процесс получает ресурс, который позже освобождает для повторного использования другими процессами. Другие ресурсы являются расходуемыми (consumable) – могут быть созданы (произведены) и уничтожены (потреблены), например – передаваемые и принимаемые сообщения. Тупики, связанные с выделенными ресурсами Традиционная последовательность событий при работе с ресурсом состоит из запроса, использования и освобождения ресурса. Тип запроса зависит от природы ресурса и от ОС. Запрос может быть явным, например специальный вызов request, или неявным — open для открытия файла. Обычно, если ресурс занят и запрос отклонен, запрашивающий процесс переходит в состояние ожидания. Управление ресурсами можно осуществлять с помощью семафоров. При запросе нескольких ресурсов разными процессами, возникновение взаимоблокировки зависит от порядка запроса ресурсов процессами. Условия возникновения тупиков 1) Условие взаимоисключения (Mutual exclusion). Одновременно использовать ресурс может только один процесс, т. е. он либо выделен, либо доступен. 2) Условие ожидания ресурсов (Hold and wait, удержания и ожидания). Процессы удерживают ресурсы, уже выделенные им, и могут запрашивать другие ресурсы. 3) Условие неперераспределяемости (No preemption, невыгружаемости). Ресурс, выделенный ранее, не может быть принудительно забран у процесса. Освобождены они могут быть только процессом, который их удерживает. 4) Условие кругового (циклического) ожидания (Circular wait). Существует кольцевая цепь процессов, в которой каждый процесс ждет доступа к ресурсу, удерживаемому другим процессом цепи. Первые три условия необходимы, но недостаточны. Для образования тупика необходимым и достаточным является выполнение всех четырех условий.
Пример конкуренции двух процессов в борьбе за повторно используемый ресурс К взаимоблокировке приведет последовательность шагов p 0, q 0, p 1, q 1 Ресурсная взаимоблокировка в сети Тупики коммуникационного типа Разновидность взаимоблокировок может проявиться в системах обмена данными (например, в сетях), в которых один и более процессов связываются путем обмена сообщениями. Общая договоренность предполагает, что процесс А отправляет сообщениезапрос процессу В, а затем блокируется до тех пор, пока В не пошлет назад ответное сообщение. Предположим, что сообщение-запрос где-то затерялось. Процесс А заблокирован в ожидании ответа. Процесс В заблокирован в ожидании запроса на какиелибо его действия. В результате возникает взаимоблокировка. Для предотвращения взаимоблокировки используется таймер, ограничивающий время ожидания прихода сообщения.
Активная взаимоблокировка (livelock) Пусть пара процессов использует два ресурса. Каждому из процессов нужны два ресурса, и они используют область входа в примитив активного ожидания (мьютекс), чтобы попытаться получить необходимые блокировки. Если попытка не удается, процесс пробует вновь. Если процесс А запускается первым и получает ресурс 1, а затем запускается процесс 2 и получает ресурс 2, неважно, какой из них будет запущен следующим, он не добьется дальнейших успехов, но ни один из процессов не будет заблокирован. Каждый из них будет использовать свой квант времени центрального процессора снова и снова, без продвижения вперед, но и без блокирования. Таким образом, имеется не взаимоблокировка (поскольку ни один из процессов не заблокирован), а некий ее функциональный эквивалент: активная взаимоблокировка (livelock). Может возникнуть из-за ограниченного числа записей в таблице, которые определяют общее количество разрешенных процессов. Зависание В динамической системе запрос ресурсов происходит постоянно. Для того чтобы принять решение, кто и когда какой ресурс получит, нужна определенная политика. Эта политика, может привести к тому, что некоторые процессы никогда не будут обслужены, даже если они не находятся в состоянии взаимоблокировки. В качестве примера рассмотрим распределение принтера. Представим себе, что система использует некий алгоритм, гарантирующий, что распределение принтера не приводит к взаимоблокировкам. Теперь предположим, что несколько процессов все разом захотели получить принтер в свое распоряжение. Один из возможных алгоритмов предусматривает передачу принтера тому процессу, у которого самый маленький файл для вывода на печать (предположим, что подобная информация доступна). А что получится на работающей системе, где у одного процесса есть для вывода на печать огромный файл? Как только принтер освободится в очередной раз, система выберет процесс с самым коротким файлом. Если поток процессов с короткими файлами не иссякает, процесс с огромным файлом не получит принтер никогда. Он просто намертво зависнет (будет отложен навсегда, даже если и не будет заблокирован). Зависания можно избежать за счет использования политики распределения ресурсов FCFS.
Моделирование взаимоблокировок с использованием направленных графов Графы распределения взаимоблокировка (в) ресурсов: ресурс занят (а); запрос ресурса (б);
2. Основные направления борьбы с тупиками
Обнаружение взаимоблокировки при использовании нескольких ресурсов каждого типа Работает n процессов, от Р 1 до Рп. Пусть m — это число классов ресурсов, Е 1 — количество ресурсов класса 1, Е 2 — количество ресурсов класса 2, а в общем, Еj — количество ресурсов класса j (где 1 < j < m). Е — это вектор существующих ресурсов. Он передает общее количество имеющихся в наличии экземпляров каждого ресурса. Например, если класс 1 представляет собой накопители на магнитных лентах, то Е 1 = 2 означает, что в системе есть два таких накопителя. В любой момент времени какие-то ресурсы могут быть выделены и недоступны. Пусть А будет вектором доступных ресурсов, где Аj дает количество экземпляров ресурса j, доступных на данный момент (то есть не выделенных). Если оба накопителя на магнитной ленте уже выделены, А 1 будет равно 0. Теперь нужны еще два массива: С — матрица текущего распределения и R — матрица запросов, i-я строка в матрице С говорит о том, сколько экземпляров каждого класса ресурсов в данный момент удерживает процесс Рi. Таким образом, Сij — это количество экземпляров ресурса j которое удерживается процессом i. По аналогии с этим, Rij — это количество экземпляров ресурса j, которое хочет получить процесс Рi. Каждый ресурс является либо выделенным, либо доступным. Это означает, что:
Обнаружение взаимоблокировки при использовании нескольких ресурсов каждого типа Структуры данных, необходимые для работы алгоритма обнаружения взаимоблокировок Пример работы алгоритма обнаружения взаимоблокировок
Основные направления борьбы с тупиками: • Игнорирование проблемы в целом. • Предотвращение тупиков за счет структурного подавления одного из 4 условий их возникновения и за счет тщательного распределения ресурсов. • Обнаружение тупиков. • Восстановление после тупиков. Игнорирование проблемы тупиков Любая ОС, имеющая в ядре ряд массивов фиксированной размерности, потенциально страдает от тупиков, даже если они не обнаружены. Таблица открытых файлов, таблица процессов, фактически каждая таблица являются ограниченными ресурсами. Заполнение всех записей таблицы процессов может привести к тому, что очередной запрос на создание процесса может быть отклонен. При неблагоприятном стечении обстоятельств несколько процессов могут выдать такой запрос одновременно и оказаться в тупике. Подход большинства популярных ОС (Unix, Windows и др. ) состоит в том, чтобы игнорировать данную проблему в предположении, что маловероятный случайный тупик предпочтительнее, чем правила, заставляющие пользователей ограничивать число процессов, открытых файлов и т. п.
Способы предотвращения тупиков 1. Способы предотвращения тупиков путем тщательного распределения ресурсов. Алгоритм банкира Алгоритм базируется на так называемых безопасных или надежных состояниях (safe state). Безопасное состояние — это такое состояние, для которого имеется по крайней мере одна последовательность событий, которая не приведет к взаимоблокировке, т. е. существует такой порядок планирования, при котором каждый процесс может доработать до конца, даже если все процессы внезапно и срочно запросят максимальное количество ресурсов. Модель алгоритма основана на действиях банкира, который, имея в наличии капитал, выдает кредиты. Термин ненадежное состояние не предполагает, что обязательно возникнут тупики. Он лишь говорит о том, что в случае неблагоприятной последовательности событий система может зайти в тупик. Алгоритм позволяет уклониться от взаимоблокировки, не удовлетворяя запроса, если тот вовлечет систему в небезопасное состояние. Суть алгоритма : • Предположим, что у системы в наличии n устройств, например, лент. • ОС принимает запрос от пользовательского процесса, если его максимальная потребность не превышает n. • Пользователь гарантирует, что если ОС в состоянии удовлетворить его запрос, то все устройства будут возвращены системе в течение конечного времени. • Текущее состояние системы называется надежным, если ОС может обеспечить всем процессам их выполнение в течение конечного времени. • В соответствии с алгоритмом банкира выделение устройств возможно, только если состояние системы остается надежным.
Способы предотвращения тупиков 1. Способы предотвращения тупиков путем тщательного распределения ресурсов. Алгоритм банкира Пример надежного состояния с 3 пользователями и 11 устройствами, из которых 9 задействовано, а 2 находятся в резерве Данный алгоритм обладает тем достоинством, что при его использовании нет необходимости в перераспределении ресурсов и откате процессов назад. Однако использование этого метода требует выполнения ряда условий: • Число пользователей и число ресурсов фиксировано. • Число работающих пользователей должно оставаться постоянным. • Алгоритм требует, чтобы клиенты гарантированно возвращали ресурсы. • Должны быть заранее указаны максимальные требования процессов к ресурсам. Чаще всего данная информация отсутствует.
Способы предотвращения тупиков 1. Способы предотвращения тупиков путем тщательного распределения ресурсов. Алгоритм банкира Примеры безопасного и небезопасного состояний (в системе 10 экземпляров данного ресурса, 7 из которых уже распределены, а 3 пока свободны) (процесс А запрашивает дополнительный ресурс на шаге (б), что приводит к небезопасному состоянию)
Способы предотвращения тупиков 1. Способы предотвращения тупиков путем тщательного распределения ресурсов. Алгоритм банкира Пример определения безопасного состояния
Способы предотвращения тупиков 1. Способы предотвращения тупиков путем тщательного распределения ресурсов. Алгоритм банкира Пример определения опасного состояния
Способы предотвращения тупиков 1. Способы предотвращения тупиков путем тщательного распределения ресурсов. Алгоритм банкира Состояния распределения ресурсов: безопасное (а, б); небезопасное (в) Алгоритм банкира для нескольких типов ресурсов
Способы предотвращения тупиков 2. Предотвращение тупиков за счет нарушения условий возникновения тупиков Косвенный метод – нарушение первых трех условий (обязательные правила), прямой – четвертого (наблюдается при определенной последовательности запросов и освобождений ресурсов). А. Нарушение условия взаимоисключения. В общем случае избежать взаимоисключения невозможно. Доступ к некоторым устройствам должен быть исключительным. Но, например принтер может использоваться несколькими процессами. Решение проблемы за счет применения спулинга (spooling), когда за вывод на печать отвечает один системный процесс, называемый сервисом или демоном принтера, промежуточные данные для печати при этом формируются на диске, т. е. на разделяемом устройстве – выходные данные выдают несколько процессов. Принтер становится разделяемым устройством и тупик для него устранен. Б. Нарушение условия ожидания ресурсов. Условия ожидания ресурсов можно избежать, потребовав выполнения стратегии двухфазного захвата. • В первой фазе процесс должен запрашивать все необходимые ему ресурсы сразу. До тех пор пока они не предоставлены, процесс не может продолжать выполнение. • Если в первой фазе некоторые ресурсы, которые были нужны данному процессору, уже заняты другими процессами, он освобождает все ресурсы, которые были ему выделены, и
Способы предотвращения тупиков 2. Предотвращение тупиков за счет нарушения условий возникновения тупиков В. Нарушение принципа отсутствия перераспределения. Если бы можно было отбирать ресурсы у удерживающих их процессов до завершения этих процессов, то удалось бы добиться невыполнения третьего условия возникновения тупиков. Недостатки данного подхода. 1. Отбирать у процессов можно только те ресурсы, состояние которых легко сохранить, а позже восстановить, например состояние процессора. 2. Если процесс в течение некоторого времени использует определенные ресурсы, а затем освобождает эти ресурсы, он может потерять результаты работы, проделанной до настоящего момента. 3. Следствием данной схемы может быть дискриминация отдельных процессов, у которых постоянно отбирают ресурсы. Г. Нарушение условия кругового ожидания. Первый способ - упорядочить ресурсы. Например, можно присвоить всем ресурсам уникальные номера и потребовать, чтобы процессы запрашивали ресурсы в порядке их возрастания. После последнего запроса и освобождения всех ресурсов, можно Пронумерованные ресурсы и граф ресурсов разрешить процессу опять осуществить первый запрос. Пример – иерархия спин-блокировок в Windows. Второй способ — действовать в соответствии с правилом, согласно которому каждый процесс может иметь только один ресурс в каждый момент времени. Если нужен второй ресурс — освободи первый.
Интегрированные стратегии разрешения взаимоблокировок У каждой стратегии разрешения взаимоблокировок есть свои достоинства и недостатки, а потому наиболее эффективным путем может оказаться применение разных подходов в различных ситуациях. • Сгруппировать ресурсы в несколько различных классов. • Для предотвращения взаимоблокировок между классами ресурсов использовать метод упорядочения типов ресурсов. • В пределах одного класса ресурсов использовать наиболее подходящий для данного типа ресурсов алгоритм. Пример такой методики для следующих классов ресурсов: • Пространство подкачки. Блоки памяти на вторичных устройствах хранения информации, используемые при свопинге процессов. Предотвращение взаимоблокировок с помощью требования, чтобы все ресурсы распределялись одновременно. Такая стратегия вполне применима, если известны максимальные требования (что зачастую выполняется на практике). Можно также использовать стратегию устранения взаимоблокировок. • Ресурсы процесса. Назначаемые устройства, такие, как стримеры или файлы. В этой категории ресурсов зачастую наиболее эффективным является использование стратегии устранения взаимоблокировок, поскольку можно ожидать, что процесс заранее объявит о требуемых ему ресурсах этого типа. Кроме того, можно использовать предотвращение взаимоблокировок путем упорядочения ресурсов в пределах данного класса. • Основная память. Страницы или сегменты, назначаемые процессу. Наиболее подходящим методом предотвращения взаимоблокировок в этом случае может оказаться перераспределение ресурсов. Процесс, ресурсы которого перераспределяются, просто сбрасывается на вторичные устройства хранения информации, освобождая основную память для разрешения взаимоблокировки. • Внутренние ресурсы. Такие ресурсы, как, например, каналы ввода-вывода. Можно использовать предотвращение взаимоблокировок путем упорядочивания ресурсов в пределах данного класса. Порядок перечисления ресурсов в приведенном списке представляет собой порядок их выделения. Этот порядок обосновывается обычной последовательностью действий процесса.
3. Обнаружение тупиков и восстановление после тупиков
Пример возникновения и предупреждения взаимоблокировки (если не требуется запускать процессы в определенном порядке –можно приостановить процесс B)
Обнаружение взаимоблокировки сводится к фиксации тупиковой ситуации и выявлению вовлеченных в нее процессов. Для этого производится проверка наличия циклического ожидания в случаях, когда выполнены первые три условия возникновения тупика. Методы обнаружения активно используют графы распределения ресурсов. Пример: • Процесс P 1 ожидает ресурс R 1. • Процесс Р 2 удерживает ресурс Р 2 и ожидает ресурс R 1. • Процесс Р 3 удерживает ресурс R 1 и ожидает ресурс R 3. • Процесс Р 4 ожидает ресурс R 2. • Процесс P 5 удерживает ресурс R 3 и ожидает ресурс R 2. Граф ресурсов Из графа видно, что имеется цикл, моделирующий условие кругового ожидания, и что процессы Р 2, Р 3, Р 5 (а может быть, и другие) находятся в тупиковой ситуации.
Пример графа ресурсов (а); извлеченный из него цикл (б)
Формальный алгоритм обнаружения взаимоблокировок Алгоритм проверяет граф и прекращает свою работу либо при обнаружении цикла, либо при обнаружении отсутствия циклов. В нем используется одна динамическая структура данных, L, представляющая собой список узлов, а также список ребер. В процессе работы алгоритма ребра помечаются, для обозначения того, что были они уже проверены, чтобы предотвратить повторную проверку. Этот алгоритм берет поочередно каждый узел в качестве корневого, в надежде, что из этого получится дерево, и выполняет в дереве поиск в глубину. Если в процессе обхода алгоритм возвращается к уже встречавшемуся узлу, значит, он нашел цикл. Если алгоритм обходит все ребра из какого-нибудь заданного узла, то он возвращается к предыдущему узлу. Если он возвращается к корневому узлу и не может идти дальше, то подграф, доступный из текущего узла, не содержит циклов. Если данное свойство сохраняется для всех узлов, значит, полный граф не содержит циклов, а система не находится в состоянии взаимоблокировки. 1. Для каждого узла N, имеющегося в графе, выполняются следующие пять шагов, использующих узел N в качестве начального. 2. Инициализируется (очищается) список L, а со всех ребер снимаются пометки. 3. Текущий узел добавляется к концу списка L, и проводится проверка, не появится ли этот узел в списке L дважды. Если это произойдет, значит, граф содержит цикл (отображенный в списке L) и алгоритм прекращает работу. 4. Для заданного узла определяется, нет ли каких-нибудь отходящих от него непомеченных ребер. Если такие ребра есть, осуществляется переход к шагу 5, если их нет, осуществляется переход к шагу 6. 5. Произвольно выбирается и помечается непомеченное отходящее от узла ребро. Затем по нему осуществляется переход к новому текущему узлу, и алгоритм возвращается к шагу 3. 6. Если этот узел является первоначальным узлом, значит, граф не содержит никаких циклов, и алгоритм завершает свою работу. В противном случае алгоритм зашел в тупик. Этот узел удаляется, и алгоритм возвращается к предыдущему узлу, то есть к тому узлу, который был текущим перед только что удаленным узлом, данный узел делается текущим и осуществляется
Пример обнаружения взаимоблокировки Обнаружив тупик, можно вывести из него систему, нарушив одно из условий существования тупика. При этом, возможно, несколько процессов частично или полностью потеряют результаты проделанной работы. Сложность восстановления обусловлена рядом факторов: • В большинстве систем нет достаточно эффективных средств, чтобы приостановить процесс, вывести его из системы и возобновить впоследствии с того места, где он был остановлен. • Если даже такие средства есть, то их использование требует затрат и внимания оператора. • Восстановление после тупика может потребовать значительных усилий.
Способы восстановления 1. Самый простой и наиболее распространенный способ устранить тупик — завершить выполнение одного или более процессов, чтобы впоследствии использовать его ресурсы. Тогда в случае удачи остальные процессы смогут выполняться. Если это не помогает, можно ликвидировать еще несколько процессов. После каждой ликвидации должен запускаться алгоритм обнаружения тупика. По возможности лучше ликвидировать тот процесс, который может быть без ущерба возвращен к началу (такие процессы называются идемпотентными). Примером такого процесса может служить компиляция. 2. В некоторых случаях можно временно забрать ресурс у текущего владельца и передать его другому процессу. Возможность забрать ресурс у процесса, дать его другому процессу и затем без ущерба вернуть назад сильно зависит от природы ресурса. 3. В ряде систем реализованы средства отката и перезапуска или рестарта с контрольной точки (сохранение состояния системы в какой-то момент времени). Если проектировщики системы знают, что тупик вероятен, они могут периодически организовывать дли процессов контрольные точки. Иногда это приходится делать разработчикам прикладных программ. Когда тупик обнаружен, видно, какие ресурсы вовлечены в цикл кругового ожидания. Чтобы осуществить восстановление, процесс, который владеет таким ресурсом, должен быть отброшен к моменту времени, предшествующему его запросу на этот ресурс.
Литература: 1. Таненбаум Э. Современные операционные системы. 3 -е изд. с. 507… 544. 2. Столингс В. Операционные системы. 4 -е изд. – M. : Издательский дом «Вильямс» , 2002, с. 319… 353. 3. Основы операционных систем. Курс лекций. Учебное пособие / В. Е. Карпов, К. А. Коньков / под редакцией В. П. Иванникова. – М. : ИНТУИТ. РУ «Интернет-Университет Информационных Технологий» , 2005, с. 115… 124.