Как VxWorks справляется с наследованием приоритетов? - PullRequest
0 голосов
/ 20 сентября 2008

У нас есть 3 задачи, выполняющиеся с разными приоритетами: A (120), B (110), C (100). A принимает мьютексный семафор с флагом Inversion Safe. Задача B выполняет semTake, в результате чего приоритет задачи A повышается до 110. Позже, задача C делает semTake. Приоритет задачи А теперь 100.

В этот момент А выпускает семафор, а С хватает его. Мы замечаем, что приоритет А не вернулся к первоначальному значению 120. Разве приоритет А не должен быть восстановлен сразу?

1 Ответ

5 голосов
/ 20 сентября 2008

В идеале, когда унаследованный уровень приоритета понизится, это будет сделано пошагово. Как каждый зависимость, вызвавшая повышение уровня приоритета, удаляется, унаследованный уровень приоритета должен опуститься до уровня приоритета самая высокая оставшаяся зависимость.
Например:

задание A (от 100 до 80) имеет два мьютекса (X & Y) что задачи B (pri 90) и C (pri 80) соответственно ожидают выполнения за. Когда задача A передает мьютекс Y задаче C, можно ожидать, что ее Приоритет упадет до 90. Когда он, наконец, откажется от мьютекса X для задачи B, мы ожидаем, что уровень приоритета упадет до 100.

Приоритетное наследование не работает в VxWorks.
Как это работает, зависит от используемой версии VxWorks.

pre-VxWorks 6.0

Уровень приоритета остается «повышенным» до тех пор, пока блокировка на семействе мьютексов отказывается от своего последнего инверсионно-безопасного мьютекса семафор.

Используя приведенный выше пример, когда задача A отказывается от мьютекса Y для задачи C ее приоритет остается равным 80. После того, как он откажется от мьютекса X для Задача B, тогда ее приоритет снизится до 100 (пропуская 90).

Давайте добавим кривая мяч № 1 в микс. Что если у задачи А была блокировка мьютекса Z, пока все это происходило, но никто не ожидал Z? В этом В этом случае уровень приоритета останется на уровне 80, пока не будет отказано в Z - тогда оно упадет до 100.

Почему так?
Это просто, и в большинстве случаев это хорошо довольно. Тем не менее, это означает, что когда «кривая шар № 1» вступает в играть, приоритет будет оставаться выше в течение более длительного периода времени, чем необходимо.

VxWorks 6.0 +

Уровень приоритета сейчас остается активным до тех пор, пока не будет заблокирована мьютекс Семафор отказывается от своего последнего безопасного мьютекса инверсии , который способствовал повышение уровня приоритета .

Это улучшение позволяет избежать проблемы "Кривой мяч № 1". У него есть свои ограничения. Например, если время ожидания задачи B и / или задачи C в ожидании отказа от задачи A семафоры, уровень приоритета задачи A не пересчитывается пока он не откажется от семафора.

...