Тупики Тупик – состояние мультипрограммной системы, которого ждет процесс, и которое никогда не реализуется (клинч, дедлок). Задачи ОС: - Предотвращение; - Обход; - Обнаружение. Примеры тупиков. R1 Proc. 1 Proc. 2 R2 Транспортная пробка Кольцевая цепь запросов Бесконечное ожидание – состояние системы, которого ждет процесс, является возможным, но оно откладывается на неопределенное время. Например, из-за приоритета. Ресурсы бывают: - перераспределяемые (процессор, память); - монопольные (НМЛ); - реентерабельные (неизменный код); - последовательного использования. Условия возникновения тупиков (необходимые): 1. Монопольное управление выделенными ресурсами (взаимоисключение); 2. Удержание ресурсов на время ожидания следующего; 3. Ресурсы у процесса нельзя отобрать, отдает их сам (неперераспределение); 4. Существование кольцевой цепи запросов. Предотвращение тупиков. Принципы Хавендера. Хавендер показал, что для предотвращения тупика необходимо нарушить одно из необходимых условий его возникновения. Принципы Хавендера: Процесс запрашивает все нужные ресурсы сразу. До выделения – ждет. Если процессу не выделяется очередной ресурс, он должен отдать уже выделенные. Вводим линейную упорядоченность на типы ресурсов. Процесс может запросить ресурсы только в порядке увеличения номера ресурса. Условие монопольного управления Хавендер не нарушает. Процесс запрашивает все нужные ресурсы сразу. До выделения – ждет. Нарушается условие возникновения тупиков: 2 .Удержание ресурсов на время ожидания следующего; Плюс: простота реализации. Минусы: - Как определить набор всех необходимых процессу ресурсов? - Простой свободных ресурсов. - Накапливание ресурсов приводит к высоким издержкам. Если процессу не выделяется очередной ресурс, он должен отдать уже выделенные. Нарушается условие возникновения тупиков: 3. Ресурсы у процесса нельзя отобрать, отдает их сам (неперераспределение); Плюс: ???. Минусы: - Как сохранить промежуточные результаты работы процесса? - Возможность бесконечного откладывания (дефицитный ресурс). Вводим линейную упорядоченность на типы ресурсов. Процесс может запросить ресурсы только в порядке увеличения номера ресурса. Нарушается условие возникновения тупиков: 4. Существование кольцевой цепи запросов. Плюс: кажущаяся простота реализации. Минусы: - Сложно вводить в систему новые ресурсы (ОС). - Кто знает «правильную» последовательность ресурсов? - Трансляторы тоже должны знать номера ресурсов, а это сложно и снижает мобильность систем. Вывод – принципы Хавендера носят скорее теоретический характер. На практике они используются как вспомогательные элементы стратегий. Обход тупиков. Алгоритм банкира. Банкир – выдает ссуды (кредиты) тем, кто может их возвратить. Дейкстра предложил алгоритм обхода тупиков, если все условия их возникновения не нарушены. Алгоритм банкира – ресурсы процессу можно выдавать только в том случае, если состояние системы останется надежным. Надежное состояние – ОС гарантирует всем процессам завершение в конечное время. Введем следующие обозначения: M(i) – максимальная потребность i-го процесса в ресурсе; L(i) – текущая величина ресурса, выделенного i-му процессу; С(i) – текущая потребность в ресурсе, C(i)=M(i)-L(i); Т – суммарный ресурс, имеющийся в системе; а – остаточный ресурс, а=Т-L(i); Рассмотрим пример Пусть в некоторый момент времени в системе существуют три процесса. Распределение ресурсов приведено в таблице: L(i) M(i) C(i) Process 1 1 4 3 Process 2 4 6 2 Process 3 5 8 3 a 2 T=12 Решение примера Будем выделять остаточный ресурс процессам и оценивать состояние системы. 1. Lnew(1) = L(1) + a =1+2=3 C(1)=M(1)-Lnew(1)=4 - 3 =1>0 C(2)=2>0; C(3)=3>0 Все C(i)>0, состояние системы ненадежное. 2. Lnew(3) = L(3) + a =5+2=7 C(3)=M(3)-Lnew(3)=8 - 7 =1>0 C(1)=3>0; C(2)=2>0 Все C(i)>0, состояние системы ненадежное. 3. Lnew(2) = L(2) + a =4+2=6 C(2)=M(2)-Lnew(2)=6 - 6 =0 C(1)=3>0; C(3)=3>0 C(2)=0, состояние системы надежное. Решение примера (продолжение) Будем выделять остаточный ресурс процессам и оценивать состояние системы. 4. a = 6, после завершения Process (2) 5. Lnew(1) = L(1) + a’ =1+3=4 C(1)=M(1)-Lnew(1)=4 - 4 =0 C(3)=3>0; C(1)=0, состояние системы надежное. 6. a = 7, после завершения Process (1) 7. Lnew(3) = L(2) + a’ =5+3=8 C(3)=M(3)-Lnew(3)=8 - 8 =0 C(3)=0; C(3)=0, состояние системы надежное. 8. a = 12, все процессы завершены. Недостатки алгоритма банкира 1. Фиксированное число ресурсов в системе. 2. Фиксированное число процессов в системе. 3. Время реакции ОС на запрос от процесса может слабо отличаться от «бесконечного». 4. Кто должен определять максимальную потребность в ресурсах? 5. Возможен переход в однопрограммный режим. Обнаружение тупиков Обнаружение тупика – установление факта наличия в системе процессов ожидающих «нереализуемое» состояние. Основной подход к решению – построение графа распределения ресурсов и нахождение в нем циклов. Чрезвычайно затратный подход. На практике в чистом виде не используется. Восстановление системы после обнаружения тупика Восстановление работы системы – продолжение работы некоторых процессов после устранения причины тупика. Сложности решения: • Неочевидность тупика. • Трудно остановить процесс в произвольной точке кода. • Большие накладные расходы на реализацию сохранения результатов. • В системах с большим числом разноприоритетных процессов трудно удалить процессы с высоким приоритетом. Виртуализация ресурсов – средство борьбы с тупиками Система не устраняет условий возникновения тупиков – при возникновении конкурирующих запросов ВСЕ ресурсы могут быть заменены на «виртуальный аналог». Особенности решения: • Алгоритмически простое решение. • Формально, не боится большого числа процессов. • Сложность возврата из «виртуального мира» в реальный в случае иерархической виртуальности. Небольшой пример Виртуальный мир (для красной машины) Транспортная пробка (реальный мир) Устранение пробки (в реальном мире) Осталась только одна проблема – как вернуть красную машину из виртуального мира в реальный? (См. «Дозоры …»)