Приоритетное приоритетное планирование задач с бесконечным циклом
В Google и Stackru имеется много материалов, касающихся приоритетного приоритетного планирования, но у меня все еще есть путаница в отношении планирования задач с бесконечным циклом в ядре приоритетного приоритетного планирования. Давайте рассмотрим следующий случай:
ОСРВ запускает две задачи 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 ответ
В этом случае обе задачи приостанавливаются один раз. perform_some_taskN();
были выполнены (освобождение ресурсов, которые будут использоваться другими потоками). Согласно документации:
Функция usleep() приведет к приостановке выполнения вызывающего потока до тех пор, пока не истечет число микросекунд реального времени, указанное в аргументе useconds, или пока не будет доставлен сигнал вызывающему потоку, и его действие - вызвать перехват сигнала. функция или прекратить процесс. Время приостановки может быть больше, чем запрошено из-за планирования другой активности системой.
КСТАТИ, usleep()
устарела (используйте nanosleep()
вместо)
POSIX.1-2001 объявляет эту функцию устаревшей; вместо этого используйте nanosleep(2). POSIX.1-2008 удаляет спецификацию usleep().