2016-06-01 2 views
3

В приведенном ниже сценарии, как приоритет задачи 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? 
    . 
} 

Кроме того, в приведенном выше сценарии семафор блокировки и выпуска не соответствуют друг другу, что это ошибочное, но программа может ошибочно сделать это, то в этом случае, как лечащий врач будет работать.

ответ

1

Приоритетный потолок был создан, чтобы избежать инверсии приоритета. Хорошо реализованный алгоритм всегда придавал каждому процессу наивысший приоритет, связанный с каждым из ресурсов, которыми владеет этот процесс (в данном случае - семафоры). Поэтому, в частности, в отношении вашего примера кода: после принятия S1 приоритет процесса будет увеличен до 4, а затем, взяв S2, он снова будет поднят до 6. После отпускания приоритета S1 все равно 6 (S2 все еще удерживается). После освобождения S2 он должен вернуться к приоритету == 2.

+0

Понял. но что произойдет, если приоритет S1 равен 6, а приоритет S2 равен 4, поэтому при освобождении S1 приоритет вернется к 2, а затем снова будет увеличен до 4, поскольку до этого он никогда не поднимался до 4. Если это так, то как этот рейз до 4 будет запущен, так как s2 был заблокирован перед выпуском S1, то что будет запускать это rasie. –

+0

Я полностью понимаю ваши проблемы, и я могу предположить, что некоторые RTOS имели уязвимую реализацию в определенный момент времени. Однако я считаю, что это может быть выполнено правильно. Независимо от того, какие RTOS вы используете, вы можете получить список всех запущенных процессов вместе с их приоритетами и увидеть результат для себя. Что касается того, чтобы ваш процесс не был понижен до p2, прежде чем вернуться к 4, это более сложно. Вам нужно будет написать код, чтобы обнаружить это. Мне нужно обдумать это. –

+0

Чтобы обнаружить сбой в приоритете, создайте процесс приоритета 3, который выполняет операцию ввода-вывода в цикле. Если ваш первый процесс имеет приоритет 2 переходного процесса, он позволит процессу ввода-вывода планировать и выполнять его ввод-вывод. –

Смежные вопросы