
Лекция 08.Тупики.
1.Понятие тупика
Говорят, что в мультипрограммной системе процесс находится в состоянии тупика, дедлока, или клинча, если он ожидает некоторого события, которое никогда не произойдет. Системная тупиковая ситуация, или «зависание» системы — это ситуация, когда один или более процессов оказываются в состоянии тупика.
В мультипрограммных вычислительных машинах одной из главных функций операционной системы является распределение ресурсов. Когда ресурсы разделяются между многими пользователями, каждому из которых предоставляется право исключительного управления выделенными ему конкретными ресурсами, вполне возможно возникновение тупиков, из-за которых процессы некоторых пользователей никогда не смогут завершиться.
2.Примеры тупиков
Ожидание события
По-видимому, простейший способ создания тупика проиллюстрировал Холт (Но72) в программе, написанной на языке PL/I и предназначенной для того, чтобы привести процесс к тупику при работе под управлением операционной системы OS/360.
REVENGE: PROCEDURE OPTIONS(MAIN,TASK);
WAIT(EVENT);
END REVENGE;
Процесс, связанный с приведенной программой, будет все время ждать, чтобы произошло событие EVENT; однако в этой программе не предусмотрена сигнализация о наступлении ожидаемого события. Системе придется обнаруживать, что данный процесс «завис», а затем аннулировать задание, чтобы выйти из тупиковой ситуации. Тупики подобного типа обнаруживать исключительно сложно.
Транспортная пробка как пример тупика
На рис. 1 показана транспортная пробка, которая периодически возникает в наших городах. Ряд автомобилей пытаются проехать через перегруженный транспортом участок города, однако движение оказывается полностью парализованным. Здесь образовался абсолютный затор, так что необходимо вмешательство полиции, чтобы постепенно и осторожно подать автомобили назад из зоны затора и тем самым ликвидировать «пробку». В конце концов нормальное движение машин восстанавливается, однако подобные ситуации связаны с большими неприятностями, затратами нервных усилий и значительными потерями времени.
Рис. 1 Тупиковая ситуация—транспортная пробка.
Простой пример тупика при распределении ресурсов
В операционных системах тупики в большинстве случаев возникают в результате обычной конкуренции за обладание выделяемыми, или закрепляемыми ресурсами (т. е. ресурсами, которые в каждый момент времени отводятся только одному пользователю и которые поэтому иногда называются ресурсами последовательного использования}. На рис. 6.2 показан простой пример тупика подобного рода. На этом графе распределения ресурсов представлены два процесса (в виде прямоугольников) и два ресурса (в виде окружностей). Стрелка, направленная от ресурса к процессу, показывает, что данный ресурс принадлежит или был выделен данному процессу. Стрелка, направленная от процесса к ресурсу, показывает, что данный процесс требует, но пока еще не получил в свое распоряжение данный ресурс. На рисунке изображена система в состоянии тупика; процесс А удерживает в своем распоряжении ресурс 1, а для продолжения выполнения ему необходим ресурс 2. Процесс В удерживает ресурс 2, а для продолжения работы ему нужен ресурс 1. Каждый процесс ждет, чтобы другой процесс освободил нужный ему ресурс, причем каждый не освобождает свой ресурс до тех пор, пока другой не освободит свой ресурс, и т. д. Такое состояние кругового ожидания характерно для систем в тупиковом состоянии.
Рис. 6.2 Простая тупиковая ситуация.
Данная система оказалась в тупиковой ситуации, поскольку каждый процесс удерживает ресурс, запрашиваемы» другим процессом, причем ни один из процессов не хочет освободить принадлежащий ему ресурс.
Тупики в системах спулинга
Системы спулинга часто оказываются подвержены тупикам. Режим спулинга (ввода-вывода с буферизацией) применяется для повышения производительности системы путем изолирования программы от такого низкоскоростного периферийного оборудования, как устройства ввода данных с перфокарт и принтеры. Если, например, программе, выдающей строки данных на принтер, приходится ждать распечатки каждой строки перед передачей следующей строки, то такая программа будет выполняться медленно. Чтобы. повысить скорость выполнения программы, строки данных, предназначенные для печати, вначале записываются па более высокоскоростное устройство, например дисковый накопитель, где они временно хранятся до момента распечатки. В некоторых системах спулчнга программа должна сформировать все выходные данные — только после этого начинается реальная распечатка. В связи с этим несколько незавершенных заданий, формирующих строки данных ц записывающих их в файл спулинга для печати, могут оказаться в тупиковой ситуации, если предусмотренная емкость буфера будет заполнена до того, как завершится выполнение какого-либо задания. Для восстановления, или выхода из подобной тупиковой ситуации, мог бы потребоваться перезапуск, рестарт системы с потерей всей работы, выполненной до этого момента. Если система попадает в тупиковую ситуацию таким образом, что у оператора ЭВМ остаются возможности управления, то в качестве менее радикального способа восстановления работоспособности можно предложить уничтожение одного или нескольких заданий, пока у остающихся заданий не окажется достаточно свободного места в буфере, чтобы они могли завершиться.
Когда системный программист производит генерацию операционной системы, он задает размер буферных файлов для спулинга. Один из способов уменьшить вероятность тупиков при спулинге заключается в том, чтобы предусмотреть значительно больше места для файлов спулинга, чем потребуется согласно предварительной оценке. Подобное решение не всегда осуществимо, если память дефицитна. Более распространенное решение состоит в том, что для процессов входного спулинга устанавливаются ограничения, с тем чтобы они не могли принимать дополнительные задания, когда файлы спулинга начинают приближаться к некоторому порогу насыщения, например оказываются заполненными на 75 процентов. Такой подход может привести к некоторому снижению производительности системы, однако это — та цена, которую приходится платить за уменьшение вероятности тупика.
Современные системы являются в этом смысле гораздо более совершенными. Они могут позволять начинать распечатку до того, как завершится очередное задание, с тем чтобы полный или почти полный файл спулинга опустошался полностью или частично уже в процессе выполнения задания. Во многих системах предусматривается динамическое распределение буферной памяти, так что, если отведенного места в памяти оказывается мало, для файлов спулинга выделяется дополнительная память. Преимущества спулинга в общем случае оказываются гораздо более весомыми, чем те проблемы, о которых шла речь выше, однако мы хотели бы, чтобы читатель имел представление о потенциальных сложностях проектирования операционных систем.