Пример 10 наследованием приоритета

Рассмотрим три задачи - задача High, Задача Medium, и Задача Low - где названия задач передают их приоритеты и Задачам High и Low необходимо использовать общий ресурс исключительным и невытесняемым способом. Допустим, например, что Задача Low может работать первой, а обе других задачи находятся в настоящее время в состоянии ожидания (см. момент времени 0 в Рисунке 4).

Рисунок 4: Иллюстрация инверсии приоритетов.

Если Задача Low начинает использовать ресурс (начиная со времени 1, на Рисунке 4 это отмечено штриховкой с наклоном вправо), она входит в критическую секцию кода и обычно использует некоторый механизм синхронизации, чтобы препятствовать другим задачам выполнить тот же самый код. (Критическая секция - часть кода, которая требует выполнения исключительно одной задачей одновременно до завершения этой секции.), если Задача High хочет использовать тот же самый ресурс некоторое время спустя (начиная со времени 2, отмечено точками), Задача Low не может выгрузиться, потому что ресурс защищен во время ее выполнения. Итак, Задача Low продолжает выполняться, и Задача High ждет. Это называют прямым блокированием.

Однако, Задача Medium может не нуждаться в своей работе защищенного ресурса (см. время 3). Поскольку приоритет Задачи Medium выше чем Задачи Low, она, конечно, вытесняет Задачу Low и выполняется, таким образом, вынуждая Задачу High ждать продленного интервала времени (в течение времени 4 и 5), даже при том, что приоритет Задачи Medium ниже чем у Задачи High. Этот вид блокирования называют, косвенным блокированием. После того, как Задача Medium завершилась, Задача Low возобновляется в момент времени 5. Задача High может выполниться только после того, как Задача Low закончила использовать ресурс (во время 6). Теоретически, особенно если есть много задач с приоритетом Задачи Medium (между Задачей High’s и Задачей Low’s), эта ситуация может длиться неопределенно долго, таким образом непредсказуемо блокируя Задачу High. Решение в данном примере, состоит в том, чтобы увеличить приоритет Задачи Low, так, чтобы он временно стал высоким на время использования ресурса, к которому Задача High просит доступ. Тогда, никакая другая задача, кроме более высокоприоритетных, чем Задача High, не может блокировать Задачу Low, и она может безопасно завершить использование ресурса. Такое увеличение называют наследованием приоритета. Однако, это решение не полностью удовлетворительно, потому что взаимные блокировки (deadlocks) и множественное блокирование все еще могут происходить. Они проиллюстрированы в Примерах 11 и 12.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: