запрашивает ресурс 2. Заштрихованные области представляют собой состояния, когда оба процесса должны использовать
один и тот же ресурс. Учитывая, что взаимное исключение делает это невозможным, то попадания в эти области не проис-
ходит. Если система войдет в прямоугольник I1I2I5I6, то из него ей не будет выхода. Это взаимоблокировка. В точке Т си-
туацию еще можно спасти – дать работать процессу А, пока он не пересечет I4. В точке Т процесс В запрашивает ресурс.
Система должна принять решение – предоставлять его или нет.
Пусть вектора Е и А – существующие в системе ресурсы и доступные соответственно, а матрицы С и R -матрица текущего
распределения и запроса соответственно. Состояние безопасно, если система не находится в тупике и существует такой по-
рядок планирования, при котором каждый процесс может работать до завершения, даже если все процессы захотят немед-
ленно получить свое максимальное количество ресурсов.
Имеет
Макс.
Безопасно Небезопасно
А 9 3 3 3 3 3 3 4 4 4
В 4 2 4 0 0 0 2 2 4 0
С 7 2 2 2 7 0 2 2 2 2
Свободно 10 3 1 5 0 7 3 2 0 4
Например, в системе 3 процесса, и свободно 10 экземпляров ресурса одного типа. Процессу А требуется максимум 9 экземп-
ляров, В – 4, С – 7. Пусть в какой-то момент они имеют соответственно 3,2,2 экземпляра. Если процесс В запросит остав-
шиеся 2 ресурса, он их получит, отработает и освободит, в системе станет 5 свободных ресурсов. Если теперь процесс С за-
просит недостающие ему 5 ресурсов, он их сможет получить, отработает и освободит. Теперь 7 ресурсов предостаточно,
чтобы завершить процесс А. Рассмотрим небезопасную ситуацию. Процесс А запрашивает еще один ресурс и получает его.
В системе остается 2 свободных экземпляра. Процесс В запрашивает 2 ресурса, освобождает. Но 4 свободных экземпляров
недостаточно ни процессу А, ни процессу С для завершения. Значит процессу А нельзя было предоставлять еще один ресурс,
поскольку при этом система перешла из безопасного в небезопасное состояние. Небезопасное состояние еще не означает
тупика. Действительно, процесс А может успеть частично освободить ресурсы, позволяя процессу С завершиться, после чего
уже потребовать максимально возможное число ресурсов. Т.е. небезопасное состояние приводит к тупику лишь потенциаль-
но. Безопасное же состояние гарантирует, что тупика не произойдет, т.е. все процессы завершат свою работу. Однако эта
модель требует выполнения следующих условий:
- число пользователей и ресурсов фиксировано;
- число работающих пользователей остается постоянным;
- клиенты должны гарантированно возвращать ресурсы;
- максимальные требования процесса к ресурсам должны быть известны заранее.
Алгоритм банкира. Алгоритм планирования, позволяющий избегать взаимоблокировок был разработан Дейкстрой в 1965
году, и называется алгоритмом банкира. Он представляет собой расширение алгоритма обнаружения тупиков, рассмотрен-
ный ранее. Модель основана на примере банкира в небольшом городке, который имеет несколько клиентов (процессов), ко-
торым выдает по несколько кредитов (ресурсов). При заявке клиента на получение еще одного кредита, проверяется, хватит
ли у банкира сумм, чтобы в итоге все клиенты смогли завершить свои операции. Если нет, то запрос отклоняется. Фактиче-
ски алгоритм идентичен алгоритму поиска взаимоблокировок. При запросе очередного ресурса, система проверяет, что про-
изойдет, если ресурс будет выделен. Фактически моделируется ситуация, при которой процесс получил требуемый ресурс и
выполняется проверка на взаимоблокировку. Если ее нет, состояние системы останется безопасным и ресурс процессу пре-
доставляется. Если же обнаруживается взаимоблокировка, то состояние становится небезопасным, и запрос отклоняется.
Однако подобный алгоритм заранее требует полных сведений о том, сколько ресурсов может потребоваться процессу. Кроме
того, количество процессов динамически изменяется в процессе функционирования системы. Более того, ресурсы, считаю-
щиеся доступными, могут перестать такими быть в результате поломки или отказа. В результате на практике рассмотренный
алгоритм практически не используется.
Предотвращение взаимоблокировок в реальных системах основано на использовании сформулированных выше условий
Коффмана. Рассмотрим условие взаимного исключения. Если в системе нет ресурсов, отдаваемых в единоличное владение
одному процессу, взаимоблокировка невозможна. Однако на практике очень часто невозможно предоставить одновремен-
ный доступ нескольких процессов к ресурсу. Например, невозможно позволить разным процессам одновременно печатать на
принтере. Правда, в этом случае можно избежать взаимоблокировки, используя подкачку. В этой модели только один про-
цесс реально запрашивает физический принтер, являясь демоном печати. Процессы ставят задания в очередь, а демон орга-
низует их поочередную печать. Но и такая модель доступна не для всех видов ресурсов. Кроме того, конкуренция за диско-
вое пространство для подкачки сама может привести к тупику.
Условие удержания и ожидания. Можно попытаться уберечь процессы, занимающие некоторые ресурсы от ожидания ос-
тальных ресурсов, взаимоблокировок не будет. Один из возможных путей решения в том, чтобы процесс запрашивал все
необходимые ресурсы до начала работы. В результате или процесс получает все необходимое для работы, что исключает
взаимоблокировки или ожидает ресурсы, не блокируя другие процессы. Проблема в том, что предварительно не всегда из-
вестно, какие ресурсы будут требоваться. Кроме этого, ресурсы используются не оптимально.
Условие отсутствия принудительной выгрузки ресурса. Уже рассматривали, что далеко не всегда есть возможность прину-
дительно отобрать ресурс у процесса.
Условие циклического ожидания. Циклическое ожидание можно устранить несколькими способами. 1. Процесс имеет право
только на один ресурс в конкретный момент времени. Если нужен второй ресурс, процесс должен освободить первый. Это
также не всегда возможно. 2. Общая нумерация всех ресурсов. Процессы могут запрашивать столько ресурсов сколько захо-