2008-09-20 4 views
0

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

На данный момент A освобождает семафор и C захватывает его. Мы заметили, что приоритет A не возвращался к первоначальному приоритету 120. Не следует ли восстановить приоритет A сразу?

ответ

4

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

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

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

до VxWorks уровня 6,0

Приоритета остается «столкнулся» до тех пор, задача, которая имеет блокировку на мьютекс семафоре дает свою последней инверсией безопасному мьютексом семафора.

Используя пример из выше, когда задача А дает до семафора Y к задаче С, ее приоритетом остается на уровне 80. После того, как он отдает мьютекс X в задаче В, то его приоритет будет падать обратно до 100 (пропуска 90).

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

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

VxWorks 6.0+

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

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