Инверсия приоритета - Priority inversion

В Информатика, инверсия приоритета это сценарий в планирование в котором высокий приоритет задача косвенно вытесненный с помощью задачи с более низким приоритетом, эффективно меняя относительные приоритеты двух задач.

Это нарушает модель приоритета, согласно которой выполнение задач с высоким приоритетом может быть предотвращено только задачами с более высоким приоритетом и на короткое время задачами с низким приоритетом, которые быстро завершат использование ресурса, общего для задач с высоким и низким приоритетом.

Пример

Рассмотрим две задачи ЧАС и L, с высоким и низким приоритетом соответственно, каждый из которых может получить эксклюзивное использование общего ресурса р. Если ЧАС попытки приобрести р после L приобрел его, то ЧАС блокируется до тех пор, пока L отказывается от ресурса. Совместное использование ресурса исключительного использования (р в этом случае) в хорошо спроектированной системе обычно включает L отказ от р быстро, чтобы ЧАС (задача с более высоким приоритетом) не остается заблокированной в течение длительного периода времени. Однако, несмотря на хороший дизайн, возможно, что третья задача M среднего приоритета (p (L)

M)

ЧАС), где p (Икс) представляет собой приоритет задачи (Икс)) становится работоспособным во время L 'использование р. На этой точке, M быть выше по приоритету, чем L, вытесняет L (поскольку M не зависит от р), вызывая L не иметь возможности отказаться р быстро, в свою очередь, вызывая ЧАС- процесс с наивысшим приоритетом - быть неспособным к запуску (т. Е. ЧАС страдает неожиданной блокировкой, косвенно вызванной задачами с более низким приоритетом, такими как M).

Последствия

В некоторых случаях инверсия приоритета может произойти, не причиняя немедленного вреда - отложенное выполнение задачи с высоким приоритетом остается незамеченным, и в конечном итоге задача с низким приоритетом освобождает совместно используемый ресурс. Однако есть также много ситуаций, в которых инверсия приоритета может вызвать серьезные проблемы. Если осталась высокоприоритетная задача голодал ресурсов, это может привести к неисправности системы или срабатыванию заранее определенных корректирующих мер, таких как сторожевой таймер сброс всей системы. Беда, которую испытал Марс-следопыт спускаемый аппарат в 1997 году[1][2] является классическим примером проблем, вызванных инверсией приоритета в в реальном времени системы.

Инверсия приоритета также может уменьшить воспринимаемая производительность системы. Задачи с низким приоритетом обычно имеют низкий приоритет, потому что для них не важно, чтобы они закончили быстро (например, они могут быть пакетная работа или другое неинтерактивное действие). Точно так же задача с высоким приоритетом имеет высокий приоритет, потому что она, скорее всего, будет подчиняться строгим ограничениям по времени - она ​​может предоставлять данные интерактивному пользователю или действовать в соответствии с гарантиями ответа в реальном времени. Поскольку инверсия приоритета приводит к выполнению задачи с более низким приоритетом, блокирующей задачу с высоким приоритетом, это может привести к снижению быстродействия системы или даже к нарушению гарантий времени отклика.

Похожая проблема называется крайний срок обмена может произойти в самый ранний крайний срок первое планирование (EDF).

Решения

О существовании этой проблемы известно с 1970-х годов. Лэмпсон и Ределл[3] опубликовал одну из первых работ, в которой указывалось на проблему инверсии приоритета. Такие системы, как ядро ​​UNIX, уже решали проблему с примитивом splx (). Не существует надежного способа предсказать ситуацию. Однако существует множество существующих решений, наиболее распространенными из которых являются:

Отключение всех прерываний для защиты критических секций
Когда отключение прерываний используется для предотвращения инверсии приоритета, есть только два приоритета: вытесняемый, и прерывания отключены. Без третьего приоритета инверсия невозможна. Поскольку имеется только одна часть данных блокировки (бит разрешения прерывания), переупорядочивание блокировки невозможно, и поэтому взаимоблокировки невозможны. Поскольку критические области всегда работают до завершения, зависаний не происходит. Обратите внимание, что это работает, только если все прерывания отключены. Если отключено прерывание только определенного аппаратного устройства, инверсия приоритета повторно вводится посредством определения приоритета прерываний аппаратными средствами. В ранних версиях UNIX ряд примитивов splx (0) ... splx (7) отключал все прерывания до указанного приоритета. Правильно выбирая наивысший приоритет любого прерывания, которое когда-либо входило в критическую секцию, проблема инверсии приоритета могла быть решена без блокировки всех прерываний. Потолки назначены в темпо-монотонный порядок, то есть более медленные устройства имели более низкий приоритет.
В системах с несколькими процессорами используется простой вариант - «блокировка с одним разделяемым флагом». Эта схема предоставляет один флаг в общей памяти, который используется всеми процессорами для блокировки всех межпроцессорных критических секций с помощью занято-подожди. Межпроцессорная связь в большинстве систем с несколькими процессорами является дорогостоящей и медленной. Поэтому большинство таких систем предназначены для минимизации общих ресурсов. В результате эта схема действительно хорошо работает во многих практических системах. Эти методы широко используются в простых встроенные системы, где их ценят за надежность, простоту и низкое потребление ресурсов. Эти схемы также требуют умного программирования, чтобы критические разделы были очень краткими. Многие инженеры-программисты считают их непрактичными для компьютеров общего назначения.[нужна цитата ]
Протокол потолка приоритета
С участием протокол потолка приоритета, общий мьютекс процесс (который запускает код операционной системы) имеет собственный характерный (высокий) приоритет, который назначается задаче, блокирующей мьютекс. Это работает хорошо при условии, что другая задача (задачи) с высоким приоритетом, которая пытается получить доступ к мьютексу, не имеет приоритета выше максимального приоритета.
Приоритетное наследование
Под политикой наследование приоритета, всякий раз, когда задача с высоким приоритетом должна ждать некоторого ресурса, совместно используемого с выполняющейся задачей с низким приоритетом, задаче с низким приоритетом временно назначается приоритет задачи с наивысшим приоритетом ожидания на время ее собственного использования совместно используемого ресурса, таким образом сохраняя средний уровень приоритетные задачи от упреждения (первоначально) задачи с низким приоритетом и, таким образом, влияя на ожидающую задачу с высоким приоритетом. Как только ресурс высвобождается, задача с низким приоритетом продолжает работать с исходным уровнем приоритета.
Случайное повышение
Готовые задачи с замками случайным образом усилен в приоритете, пока они не выйдут из критической секции. Это решение используется в Майкрософт Виндоус.[4]
Избегайте блокировки
Поскольку инверсия приоритета включает в себя задачу с низким приоритетом, блокирующую задачу с высоким приоритетом, один из способов избежать инверсии приоритета - это избежать блокировки, например, используя неблокирующая синхронизация или читать-копировать-обновлять.

Смотрите также

Рекомендации

  1. ^ Гленн Ривз, Что на самом деле произошло на Марсе, Команда JPL Pathfinder, получено 2019-01-04
  2. ^ Объяснение проблемы инверсии приоритета, с которой столкнулся Mars Pathfinder (PDF), получено 2019-01-04
  3. ^ Лэмпсон, Б; Ределл, Д. (июнь 1980 г.). «Опыт работы с процессами и мониторами в MESA». Коммуникации ACM. 23 (2): 105–117. CiteSeerX  10.1.1.46.7240. Дои:10.1145/358818.358824. S2CID  1594544.
  4. ^ Инверсия приоритета на MSDN

внешняя ссылка