ВЗАИМНЫЕ БЛОКИРОВКИ
Взаимоблокировка процессов может происходить, когда несколько процессов борются за один ресурс.
Ресурсы бывают выгружаемые и невыгружаемые, аппаратные и программные.
Выгружаемый ресурс- этот ресурс безболезненно можно забрать у процесса (например: память).
Невыгружаемый ресурс -этот ресурс нельзя забрать у процесса без потери данных (например: принтер).
Проблема взаимоблокировок процессов возникает при борьбе за невыгружаемый ресурсы.
Условия необходимые для взаимоблокировки:
1. Условие взаимного исключения - в какой-то момент времени, ресурс занят только одним процессом или свободен.
2. Условие удержания и ожидания - процесс удерживающий ресурс может запрашивать новые ресурсы.
3. Условие отсутствия принудительной выгрузки ресурса.
4. Условие циклического ожидания - должна существовать круговая последовательность из процессов, каждый из которого ждет доступа к ресурсу, удерживаемому следующим членом последовательности.
Моделирование взаимоблокировок
Моделирование тупиков с помощью графов.
Условные обозначения
На такой модели очень хорошо проверить возникает ли взаимоблокировка. Если есть цикл значит есть и взаимоблокировка.
Рассмотрим простой пример:
три процесса A, B, C
три ресурса R, S, T
Последовательное выполнение процессов, взаимоблокировка не возникает
Рассмотрим циклический алгоритм:
три процесса A, B, C
три ресурса R, S, T
Возникает взаимоблокировка
Рассмотрим тот же самый случай, но допустим что система зная о предстоящей взаимоблокировке, заблокирует процессB.
Взаимоблокировка не возникает.
Четыре стратегии избегания взаимоблокировок:
1. Пренебрежением проблемой в целом (вдруг пронесет).
2. Обнаружение и устранение (взаимоблокировка происходит, но оперативно ликвидируется).
3. Динамическое избежания тупиков.
4. Предотвращение четырех условий, необходимых для взаимоблокировок.
1. Пренебрежением проблемой в целом (страусовый алгоритм)
Если вероятность взаимоблокировки очень мала, то ею легче пренебречь, т.к. код исключения может очень усложнить ОС и привести к большим ошибкам. Также многие взаимоблокировки тяжело обнаружить.
Этот алгоритм используется как в Linux, так и в Windows.
Поэтому (и не только) на серверах часто устанавливают автоматическую перезагрузку (раз в сутки, как правило ночью), если возникнет взаимоблокировка, то после перезагрузки ее не будет.
2. Обнаружение и устранение взаимоблокировок
Система не пытается предотвратить взаимоблокировку, а пытается обнаружить ее и устранить.