Предотвращение тупиков.
Если гарантировать, что хотя бы одно условий возникновения тупиков не будет выполнено, то взаимоблокировка станет конструктивно невозможна:
1. Если в системе нет ресурсов отданных в единоличное пользование одному процессу, то система никогда не попадет в тупик;
2. Один из способов заключается в том, что любой процесс должен запрашивать все необходимые ресурсы до начала работы. Если все ресурсы доступны, то процесс их получает и работает до успешного завершения.
При этом возникают проблемы:
3. Условие отсутствия перераспределения;
4. Условие кругового/циклического ожидания. Его можно устранить несколькими способами:
- Процессу предоставляется право только на один ресурс в конкретный момент времени, если нужен второй ресурс, то процесс должен освободить первый;
- Поддержка общей нумерации всех ресурсов. Все запросы процессов должны выполняться в соответствии с нумерацией. В результате процесс будет запрашивать, и освобождать ресурсы в соответствии с иерархией. При работе с несколькими процессами один из предоставленных ресурсов будет иметь наивысший номер. Процесс, использующий этот ресурс, ни когда не запросит другие занятые ресурсы.
Недостаток: невозможно найти порядок предоставления ресурсов удовлетворяющий всем.
Тупики без ресурсов возникают, когда два процесса блокируют друг друга, и каждый из них ждет, когда выполнит некоторое действие. Такая ситуация возникнуть при работе с семафорами и при передаче сообщений.
Еще одна проблема связанная со взаимной блокировкой- голодании, возникает при неправильной диспетчеризации(планировании) очереди к ресурсу. Голодание возникает, например, если при планировании очереди принтер предоставляется процессу с наименьшим файлом для печати. При большом количестве таких клиентов принтер никогда не будет предоставлен процессу с большим файлом, хотя процесс и не будет заблокирован. Голодание можно избежать, если использовать стратегию распределения ресурсов по FIFO.