Приоритетное приоритетное планирование задач с бесконечным циклом - PullRequest
0 голосов
/ 03 июля 2018

Существует много материалов, касающихся приоритетного приоритетного планирования в Google и Stackoverflow, но у меня все еще есть путаница в отношении планирования задач с бесконечным циклом в ядре приоритетного приоритетного планирования. Давайте рассмотрим следующий случай:

ОСРВ запускает две задачи T1 и T2 с приоритетом 50 и 100 соответственно. Обе задачи выглядят так:

void T1()
{
    while(1)
    {
        perform_some_task1();
        usleep(100);
    }
}

и

void T2()
{
    while(1)
    {
        perform_some_task2();
        usleep(100);
    }
}

Насколько я понял, ядро ​​будет планировать T2 из-за его более высокого приоритета и приостанавливать T1 из-за его более низкого приоритета. Теперь, поскольку T2 является бесконечным циклом, он никогда не опустошит процессор до T1, пока не выполнится какая-либо другая высокоприоритетная задача T2.

НО, похоже, мое понимание неверно, потому что я проверил вышеописанный случай в ОСРВ и у меня вывод на консоль распечатан обеими задачами.

Может ли кто-нибудь прокомментировать мое понимание по данному вопросу и фактическое поведение ОСРВ в вышеуказанном случае?

1 Ответ

0 голосов
/ 03 июля 2018

В этом случае обе задачи приостанавливаются после выполнения perform_some_taskN(); (освобождение ресурсов, которые будут использоваться другими потоками). Согласно документации:

Функция usleep () приведет к приостановке выполнения вызывающего потока до тех пор, пока не истечет число микросекунд реального времени, указанное в аргументе useconds, или не будет доставлен сигнал вызывающему потоку, и его действие - вызвать функция захвата сигнала или для прекращения процесса. Время приостановки может быть больше, чем запрошено, из-за планирования других действий системой.

Кстати, usleep() устарело (вместо этого используйте nanosleep()):

POSIX.1-2001 объявляет эту функцию устаревшей; используйте вместо этого nanosleep (2). POSIX.1-2008 удаляет спецификацию USleep ().

...