Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
А4_Zabolotnikov_9373.docx
Скачиваний:
19
Добавлен:
20.06.2023
Размер:
32.41 Кб
Скачать
  1. Протокол наследования приоритетов. Протокол граничных приоритетов

Протокол наследования приоритетов.

В протоколе наследования приоритетов владелец взаимной блокировки наследует приоритет, который является максимальным среди приоритетов заблокированных нитей. Если нить блокируется при попытке захватить взаимную блокировку, владелец этой блокировки временно получает приоритет блокированной нити, если он больше его собственного приоритета. При освобождении взаимной блокировки приоритет владельца восстанавливается. [4]

В ряде случаев наследование приоритетов может оказаться не самым оптимальным решением. Примером здесь может служить ситуация, когда один высокоприоритетный поток разделяет много ресурсов с низкоприоритетными потоками – по одному ресурсу на каждый поток. В такой ситуации может возникнуть положение, когда много низкоприоритетных потоков (вытесненных) выстроятся перед высокоприоритетным. Но тогда длинный ряд последовательных операций вытеснения («поштучно») и наследования приоритетов блокирующих потоков может привести к тому, что не хватит времени до окончания критического срока выполнения потока высокого приоритета, пока ОС будет анализировать ситуацию и последовательно проводить протокол наследования приоритетов.

Именно для таких ситуаций и предназначен протокол граничного приоритета. В соответствии с этим протоколом примитив синхронизации (в нашем рассмотрении это мьютекс) наделяется собственным фиксированным приоритетом, а приоритет любого потока, захватившего этот мьютекс, поднимается до предустановленного граничного уровня приоритета мьютекса. [5]

  1. Инверсия приоритетов и мьютекс

Мьютексы – это бинарные семафоры, включающие механизм наследования приоритетов. В то время как бинарные семафоры являются лучшим выбором для реализации синхронизации (между задачами или между задачами и прерыванием), мьютексы лучше подходят для реализации простого взаимного исключения (отсюда 'MUT'ual 'EX'clusion).

При использовании для взаимного исключения мьютекс действует как токен, который используется для защиты ресурса. Когда задача хочет получить доступ к ресурсу, она должна сначала получить («взять») токен. Когда она закончит работу с ресурсом, она должна «вернуть» токен, предоставив другим задачам возможность доступа к тому же ресурсу.

Мьютексы используют те же функции API доступа к семафорам, поэтому также позволяют указывать время блокировки. Это время указывает максимальное количество «тиков», в течение которых задача должна перейти в состояние «заблокировано» при попытке «взять» мьютекс, если мьютекс не доступен в настоящий момент. Однако, в отличие от бинарных семафоров, мьютексы используют приоритетное наследование. Это означает, что если задача с высоким приоритетом блокируется при попытке получить маркер, который в настоящее время удерживается задачей с более низким приоритетом, то приоритет задачи, содержащей маркер, временно повышается до приоритета блокирующей задачи. Этот механизм предназначен для обеспечения того, чтобы задача с более высоким приоритетом оставалась в заблокированном состоянии в течение как можно более короткого времени и, таким образом, сводила к минимуму уже произошедшую «инверсию приоритета».

Наследование приоритета не решает полностью проблему инверсии приоритета, но этот механизм сводит к минимуму данную проблему в некоторых ситуациях. ОСРВ жесткого реального времени должны быть разработаны таким образом, чтобы инверсия приоритетов не происходила в первую очередь.

Мьютексы не следует использовать из прерывания, потому что:

  • Они включают механизм наследования приоритетов, который имеет смысл только в том случае, если мьютекс дается и берется из задачи, а не из прерывания.

  • Прерывание не может заблокировать ожидание освобождения ресурса, охраняемого мьютексом. [6]