В приведенном ниже сценарии, как приоритет задачи t1 будет изменяться при освобождении блокировок, предполагая, что Sem_Take() и Sem_Give() являются методом блокировки и освобождения.Как работает протокол приоритетного потолка
Я понимаю, что использование протокола приоритетного потолка повышает приоритет задачи, как только ресурс заблокирован, но что происходит, когда блокировка освобождается.
void t1()//Initial priority 2
{
int a;
Sem_take(S1); //priority ceiling for S1 is 4
.
.
Sem_take(S2);//priority ceiling for S2 is 6
.
.
Sem_Give(S1);
.//What is the priority at this line?
.
Sem_Give(s2);
.//What is the priority at this line?
.
}
Кроме того, в приведенном выше сценарии семафор блокировки и выпуска не соответствуют друг другу, что это ошибочное, но программа может ошибочно сделать это, то в этом случае, как лечащий врач будет работать.
Понял. но что произойдет, если приоритет S1 равен 6, а приоритет S2 равен 4, поэтому при освобождении S1 приоритет вернется к 2, а затем снова будет увеличен до 4, поскольку до этого он никогда не поднимался до 4. Если это так, то как этот рейз до 4 будет запущен, так как s2 был заблокирован перед выпуском S1, то что будет запускать это rasie. –
Я полностью понимаю ваши проблемы, и я могу предположить, что некоторые RTOS имели уязвимую реализацию в определенный момент времени. Однако я считаю, что это может быть выполнено правильно. Независимо от того, какие RTOS вы используете, вы можете получить список всех запущенных процессов вместе с их приоритетами и увидеть результат для себя. Что касается того, чтобы ваш процесс не был понижен до p2, прежде чем вернуться к 4, это более сложно. Вам нужно будет написать код, чтобы обнаружить это. Мне нужно обдумать это. –
Чтобы обнаружить сбой в приоритете, создайте процесс приоритета 3, который выполняет операцию ввода-вывода в цикле. Если ваш первый процесс имеет приоритет 2 переходного процесса, он позволит процессу ввода-вывода планировать и выполнять его ввод-вывод. –