Атака условия циклического ожидания
Осталось только одно условие. Циклическое ожидание можно устранить несколькими способами. Один из них заключается в простом выполнении правила, которое гласит, что процессу в любой момент времени дано право только на один ресурс. Если нужен второй ресурс, процесс обязан освободить первый.
Другой способ, позволяющий избежать циклического ожидания, заключается в поддержке общей нумерации всех ресурсов, как показано на рис. 6.11, а. Теперь действует следующее правило: процессы могут запрашивать ресурс, когда только пожелают, но все запросы должны быть сделаны в порядке нумерации ресурсов. Процесс может запросить сначала принтер, затем накопитель на магнитной ленте, но не может сначала потребовать плоттер, а затем принтер.
Если придерживаться этого правила, то у графа распределения ресурсов никогда не будет циклов. Посмотрим, почему это имеет место в случае двух процессов, показанных на рис. 6.11, б. Взаимоблокировка может произойти, только если про-цесс А запросит ресурс j, а процесс В запросит ресурс i. Предположим, что ресурсы i и j относятся к разным типам, тогда они будут иметь и разные номера. Если i >j, то процессу А не разрешается запрашивать ресурсу, потому что его номер меньше, чем номер уже имеющегося у него ресурса. Если же i <j, то процесс В не может запрашивать ресурс i, потому что его номер меньше номера уже удерживаемого этим процессом ресурса. Так или иначе, взаимоблокировка невозможна.
При работе более чем с двумя процессами сохраняется та же самая логика. В любой момент времени один из предоставленных ресурсов будет иметь наивысший номер. Процесс, использующий этот ресурс, никогда не запросит тот ресурс, который уже распределен. Он или закончит свою работу, или, в худшем случае, запросит ресурс с еще большим номером, а все такие ресурсы доступны. В итоге процесс завершит работу и высвободит свои ресурсы. К этому времени какой-нибудь другой процесс будет удерживать ресурс с самым большим номером и тоже сможет завершить свою работу. Короче говоря, существует сценарий, по которому все процессы завершают свою работу, поэтому никаких взаимоблокировок и не возникает.
При незначительном изменении этого алгоритма исключается требование приобретения ресурсов в строго возрастающем порядке, и просто требуется, чтобы ни один процесс не запрашивал ресурс с меньшим номером, чем номер того ресурса, который он уже удерживает. Если процесс сначала запрашивает ресурсы 9 и 10, а затем высвобождает их обоих, то это во всех отношениях равнозначно новому началу работы, поэтому теперь уже незачем запрещать ему запрос ресурса 1.
Хотя порядковая нумерация ресурсов исключает проблему взаимоблокировок, может не представиться возможности подобрать порядок, удовлетворяющий абсолютно всех. Когда ресурсы включают в себя элементы таблицы процессов, дисковое пространство очереди печати, заблокированные записи базы данных и другие абстрактные ресурсы, количество потенциальных ресурсов и различных применений может быть настолько большим, что не сможет работать никакое упорядочение.
Различные методы предупреждения взаимоблокировок сведены в таблице.
Условие | Метод |
Взаимное исключение | Организация очереди на диске |
Удержание и ожидание | Изначальный запрос всех ресурсов |
Невыгружаемость | Отобрать ресурсы |
Циклическое ожидание | Провести порядковую нумерацию ресурсов |
Дата добавления: 2017-01-29; просмотров: 1239;