Стратегия предотвращения, по сути, представляет собой такую разработку системы, которая позволит исключить саму возможность взаимоблокировок. Методы предотвращения взаимоблокировок можно разбить на два класса. Косвенный метод состоит в предотвращении одного из первых трех условий возникновения взаимоблокировки; прямой метод предотвращает циклическое ожидание (условие 4). Рассмотрим приемы, связанные с каждым из условий, в отдельности.
Взаимоисключения
В общем случае избежать использования взаимоисключений невозможно. Если доступ к ресурсу должен быть исключительным, то операционная система обязана поддерживать взаимоисключения. Некоторые ресурсы, такие, как файлы, могут позволять множественный доступ для чтения и исключительный доступ для записи. Но даже в этом случае возможно возникновение взаимоблокировки, если право записи в файл требуется нескольким процессам одновременно.
Удержание и ожидание
Этого условия можно избежать, потребовав, чтобы процесс запрашивал все необходимые ресурсы одновременно, и блокировать процесс до тех пор, пока такой запрос не сможет быть выполнен полностью в один и тот же момент времени. Такой подход неэффективен по двум причинам. Во-первых, процесс может длительное время ожидать одновременной доступности всех затребованных ресурсов, в то время как реально он мог бы работать и только с частью из них. Во-вторых, затребованные процессом ресурсы могут оставаться неиспользуемыми значительное время, в течение которого они оказываются недоступными другим процессам. Еще одна проблема состоит в том, что процессу может не быть известно заранее, какие именно ресурсы ему потребуются.
Имеется также практическая проблема, возникающая при использовании парадигмы модульности в программировании. Использующее описанную технологию приложение для одновременного запроса должно знать о всех необходимых ресурсах на всех уровнях или во всех модулях, что противоречит упомянутой парадигме.
2 Обычно в литературе все четыре условия перечисляются как необходимые для осуществления взаимоблокировки, однако такое изложение скрывает некоторые тонкости данного вопроса [SHUB90]. Условие циклического ожидания кардинально отличается от остальных трех условий. Первые три условия представляют собой, по сути, незыблемые правила, в то время как условие 4 представляет собой ситуацию, которая может осуществиться при определенной последовательности запросов и освобождений ресурсов процессом. Объединение все четырех условий в единый блок методологически приводит к стиранию различий между предотвращением и устранением взаимоблокировок.
Отсутствие перераспределения
Этого условия можно избежать несколькими путями. Например, можно поступить следующим образом: если процесс удерживает некоторые ресурсы и ему отказано в очередном запросе, то он должен освободить захваченные ресурсы и при необходимости запросить их вновь вместе с тем ресурсом, в доступе к которому ему было отказано. С другой стороны, если процесс затребовал некий ресурс, в настоящий момент, захваченный другим процессом, то операционная система может вытеснить этот процесс и потребовать от него освободить захваченные им ресурсы. Этот метод может предотвратить взаимоблокировку лишь в том случае, когда процессы имеют разные приоритеты.
Такой подход на практике применим только к тем ресурсам, состояние которых можно легко сохранить, а позже восстановить — как, например, в том случае, когда ресурс представляет собой процессор.
Циклическое ожидание
Условия циклического ожидания можно избежать путем упорядочения типов ресурсов. При этом если процесс запросил ресурс типа R, то далее он может запросить только ресурсы, следующие согласно указанному упорядочению за R.
Чтобы убедиться в эффективности данной стратегии, свяжем с каждым типом ресурса свой индекс. Тогда ресурс Rt предшествует ресурсу Rj, если ;<;'. Теперь предположим, что два процесса, А и В, взаимно заблокированы, поскольку процесс А захватил ресурс Rt и запрашивает ресурс Rj, а процесс В захватил ресурс Rj и запрашивает ресурс Д. Однако такая ситуация невозможна, в силу того что из нее следует одновременное выполнение условий i < j и j < i.
Как и в случае предотвращения удержания и ожидания, технология предотвращения циклического ожидания может оказаться неэффективной, снижающей скорость работы процесса и закрывающей доступ к ресурсам без особой на то необходимости.