33
всякий раз, когда он готов к исполнению, и занимает процессор, до того
момента, пока не появится процесс с
еще большим приоритетом. Тогда в
случае, если процесс L находится в своей критической секции, а процесс H,
получив процессор, подошел ко входу в
критическую область, мы получаем
тупиковую ситуацию. Процесс H не может войти в критическую область,
находясь в цикле, а процесс L не получает управления, чтобы покинуть
критический участок. Чтобы не допустить возникновения подобных проблем
и повысить производительность вычислительных систем, были разработаны
различные
механизмы синхронизации.
Для организации синхронизации процессов могут применяться
специальные механизмы высокого уровня, блокирующие процесс,
ожидающий входа в критическую секцию или наступления своей очереди для
использования совместного ресурса. К таким механизмам относятся
семафоры,
мониторы и
сообщения.
Способы синхронизации процессов позволяют процессам успешно
кооперироваться, однако в
некоторых случаях могут возникнуть
непредвиденные затруднения. Предположим, что несколько процессов
конкурируют за обладание конечным числом ресурсов. Если запрашиваемый
процессом ресурс недоступен, ОС переводит данный процесс в состояние
ожидания. В случае, когда требуемый ресурс удерживается другим
ожидающим процессом, первый процесс не сможет сменить свое состояние.
Такая ситуация называется
тупиком (
deadlock). Говорят, что в
мультипрограммной системе процесс находится в
состоянии тупика, если он
ожидает события, которое никогда не произойдет.
Системная тупиковая
ситуация («з
ависание системы»), является следствием того, что один или
более процессов находятся в состоянии тупика. Иногда подобные ситуации
называют
взаимоблокировками. В
общем случае проблема тупиков
эффективного решения не имеет.
Одной
из
причин
бесконечного
ожидания
может
быть
дискриминационная политика по отношению к некоторым процессам. Однако
чаще всего событие, которого ждет процесс в тупиковой ситуации, –
освобождение ресурса. К взаимоблокировке может привести использование
как неделимых, так и разделяемых ресурсов. Например, чтение с разделяемого
диска может одновременно осуществляться несколькими процессами, тогда
как запись предполагает исключительный доступ к данным на диске. Можно
считать, что часть диска, куда происходит запись, выделена конкретному
процессу. Следовательно, тупики связаны с выделенными ресурсами, то есть
возникают, когда процессу предоставляется эксклюзивный доступ к
устройствам, файлам и другим ресурсам. Как правило, борьба с тупиками –
очень дорогостоящее мероприятие. Тем не менее, для ряда систем, например,
для систем реального времени, иного выхода нет.
Условия возникновения тупиков были сформулированы Коффманом,
Элфиком и Шошани в 1970 г. Для образования тупика необходимым и
достаточным является выполнение всех четырех условий:
34
1)
условие взаимоисключения: одновременно использовать ресурс может
только один процесс;
2)
условие ожидания ресурсов: процессы удерживают ресурсы, уже
выделенные им, и могут запрашивать другие ресурсы;
3)
условие неперераспределяемости: ресурс, выделенный ранее, не
может быть принудительно отобран у процесса;
4)
условие кругового ожидания: существует кольцевая цепь процессов, в
которой каждый процесс ждет доступа к ресурсу, удерживаемому другим
процессом цепи.
Первые три условия формируют правила, существующие в системе,
тогда как четвертое условие описывает ситуацию, которая может сложиться
при определенной неблагоприятной последовательности событий. Поэтому
методы предотвращения взаимоблокировок ориентированы, главным образом,
на нарушение первых трех условий путем введения ряда ограничений на
поведение процессов и способы распределения ресурсов. Методы
обнаружения и устранения менее консервативны и сводятся к поиску и
разрыву цикла ожидания ресурсов:
1)
игнорирование проблемы в целом;
2)
предотвращение тупиков;
3)
обнаружение тупиков;
4)
восстановление после тупиков.
Самый простой и наиболее распространенный
способ устранить тупик –
завершить выполнение одного или более процессов, чтобы впоследствии
использовать его ресурсы. Тогда в случае удачи остальные процессы смогут
выполняться. Если это не помогает, можно ликвидировать еще несколько
процессов.
После каждой ликвидации должен запускаться алгоритм обнаружения
тупика. По возможности лучше ликвидировать тот процесс, который может
быть без ущерба возвращен к началу (такие процессы называются
идемпотентными). Примером такого процесса может служить компиляция. С
другой стороны, процесс, который изменяет содержимое базы данных, не
всегда может быть корректно запущен повторно.
В
некоторых случаях можно временно отобрать ресурс у текущего
владельца и передать его другому процессу. Возможность отнять ресурс у
процесса, дать его другому процессу и затем без ущерба вернуть назад
зависит от природы ресурса. Подобное восстановление часто затруднительно.
В ряде систем реализованы средства отката и перезапуска или рестарта с
контрольной точки (сохранение состояния системы в
какой-то момент
времени). Если проектировщики системы знают, что тупик вероятен, они
могут периодически организовывать для процессов контрольные точки.
Когда тупик обнаружен, видно, какие ресурсы вовлечены в цикл
кругового ожидания. Чтобы осуществить восстановление, процесс, который
владеет таким ресурсом, должен быть отброшен к моменту времени,
предшествующему его запросу на этот ресурс.
35
Таким образом, возникновение тупиков является потенциальной
проблемой любой операционной системы. Они возникают, когда имеется
группа процессов, каждый из которых пытается получить исключительный
доступ к некоторым ресурсам и претендует на ресурсы, принадлежащие
другому процессу. В
итоге все они оказываются в состоянии бесконечного
ожидания. С тупиками можно бороться, можно их обнаруживать, избегать и
восстанавливать систему после тупиков. Однако цена подобных действий
высока и соответствующие усилия должны предприниматься только в
системах,
где
игнорирование
тупиковых
ситуаций
приводит
к
катастрофическим последствиям.
Достарыңызбен бөлісу: