Способы обхода тупиков путем тщательного распределения ресурсов
При предотвращении тупиков целью является обеспечение условий, исключающих возможность возникновения тупиковых ситуаций.
Система, предоставляя ресурс в распоряжение процесса, должна принять решение, безопасно это или нет. Возникает вопрос: есть ли такой алгоритм, который помогает всегда избегать тупиков и делать правильный выбор. Ответ - да, мы можем избегать тупиков, но только, если определенная информация известна заранее. В данной секции мы рассмотрим пути предотвращения тупиков за счет тщательного распределения ресурсов.
Один из алгоритмов предотвращения тупиков базируется на концепции безопасных состояний.
Алгоритм банкира.
Можно избежать тупиковой ситуации, если рациональным образом использовать ресурсы, придерживаясь
определенных правил. Наиболее известен среди алгоритмов такого рода - алгоритм банкира, предложенный Дейкстрой. Он, как бы имитирует действия банкира, который, располагая определенным источником капитала, принимает ссуды и выдает платежи.
Предположим, что у системы в наличии n устройств, например лент. Суть алгоритма состоит в следующем.
· ОС принимает запрос от пользовательского процесса, если его максимальная потребность не превышает n.
· Пользователь гарантирует, что если ОС в состоянии удовлетворить его запрос, то все устройства будут возвращены системе в течение конечного времени.
· Текущее состояние системы называется надежным, если ОС может обеспечить всем процессам их выполнение в течение конечного времени.
· В соответствии с алгоритмом банкира выделение устройств возможно, только если состояние системы остается надежным.
Рассмотрим пример надежного состояния для системы с тремя пользователями и 12-ю устройствами, где 10 устройств задействовано, а 2 имеется в наличии. Пусть текущая ситуация такова:
Текущее количество | Максимальная потребность | |
Первый пользователь | ||
Второй пользователь | ||
Третий пользователь |
Данное состояние надежно. Последующие действия системы могут быть таковы. Вначале удовлетворить запросы второго пользователя, затем дождаться, когда он выполнит свою работу и освободит свои 6 устройств. Затем можно обслужить остальных пользователей. То есть, система удовлетворяет только те запросы, которые оставляют ее в надежном состоянии и отклоняет остальные.
Термин ненадежное состояние не предполагает, что обязательно возникнут тупики. Он лишь говорит о том, что в случае неблагоприятной последовательности событий система может зайти в тупик.
Недостатки алгоритма банкира
У алгоритма банкира имеются серьезные недостатки, из-за которых разработчик может выбрать другой подход для решения проблемы тупиков:
· Алгоритм банкира исходит из фиксированного количества ресурсов.
· Он требует, чтобы число работающих пользователей оставалось постоянным
· Данный алгоритм требует, чтобы распределитель гарантированно удовлетворял запросы за конечный период времени. Очевидно, что для реальных систем нужны более конкретные гарантии.
· Алгоритм требует, чтобы клиенты гарантированно возвращали ресурсы. Опять таки в реальных системах требуются, гораздо более конкретные гарантии.
· Требуется, чтобы пользователи заранее указали свои максимальные потребности в ресурсах. При динамическом распределении ресурсов трудно оценить максимальные потребности пользователей.
Предотвращение тупиков за счет нарушения условий возникновения тупиков.
Как же может реальная система избежать тупиков, если отсутствует информация о будущих запросах? Для ответа на этот вопрос вернемся к четырем условиям раздела 7.3. Если мы сможем организовать работу системы так, что, по крайней мере, одно из этих условий не удовлетворено, тупик не возможен.