Я проверил задержку rt-процесса циклическим тестированием. И обнаружил, что при запуске нескольких процессов rt с более низким приоритетом (приоритет 40) задержка процесса rt с высоким приоритетом станет больше. Я не могу этого объяснить.
cyclictest - одна из программ rt-тестов. https://github.com/jlelli/rt-tests/tree/master/src/cyclictest
Cyclictest измеряет задержку между истечением таймера и фактическим выполнением потока, который установил таймер. Это делается путем создания моментального снимка непосредственно перед ожиданием определенного интервала времени c (t1), затем создания другого моментального снимка после завершения таймера (t2), затем сравнения теоретического времени включения с фактическим временем активации (t2). - (t1 + sleep_time)). Это значение представляет собой задержку для этого таймера.
Фальшивый код циклического теста:
clock_gettime(CLOCK_MONOTONIC, &t1);
next = t1 + 1000;
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL);
clock_gettime(CLOCK_MONOTONIC, &t2);
latency = t2 - next;
Команда теста (-p80 означает, что приоритет тестового потока равен 80, -n означает использование clock_nanosleep к ожиданию определенного c временного интервала): . / cyclictest -p80 -n
Беспокоящий процесс прост:
struct sched_param schedp;
schedp.sched_priority = 40;
sched_set_scheduler(0, SHED_FIFO, &schedp);
while(1) {
srand(time(0));
while(j++ < rand()%1000000);
usleep(10);
}
In Linux ядро, независимо от количества процессов с более низким приоритетом, если процесс с высоким приоритетом работает, он будет выполняться немедленно.
Может кто-нибудь объяснить, почему запуск нескольких процессов с низким приоритетом может повлиять на процесс с высоким приоритетом? латентность