Невозможно изменить круговой квант времени в linux в реальном времени - PullRequest
3 голосов
/ 20 июля 2011

Я пишу программу на C ++ для SUSE Linux Real Time и пытаюсь собрать статистику синхронизации для своей политики планирования циклического перебора (RR).Я могу установить политику RR через

#include <sched.h>
...
struct sched_param sparms;
sparms.sched_priority = 99;
if (sched_setscheduler(0, SCHED_RR, &sparms) < 0){
   perror("sched_setsched");
   exit(1);
}

и могу определить квант времени через sched_rr_get_interval().В документации ОС указано, что квант времени можно изменить с помощью приятного значения процесса.Тем не менее, это не имело никакого эффекта.Я изменил значение nice с помощью nice() и подтвердил, что оно действительно изменилось с помощью getpriority(), но sched_rr_get_interval() возвращает то же самое время.Кто-нибудь знает, что происходит?

Редактировать: Добавлен код ниже.setpriority() не работал.

...
#include <stdio.h>
#include <unistd.h>
#include <sys/resource.h>
...
// Set scheduler to RR
struct sched_param sparms;
sparms.sched_priority = 99;
if(sched_setscheduler(0, SCHED_RR, &sparms) < 0){
    fprintf(stderr, "Error setting thread scheduling policy & priority.");
    exit(-1);
}
timespec qtm;
sched_rr_get_interval(0, &qtm);
fprintf(stderr, "Time quantum(thread 1): %lds %ldns.\n", qtm.tv_sec, qtm.tv_nsec);
fprintf(stderr, "Current nice value: %d\n", getpriority(PRIO_PROCESS, 0));
if(nice(90) < 0) fprintf(stderr, "Error setting time quantum.\n");
//setpriority(PRIO_PROCESS, 0, 10);
fprintf(stderr, "New nice value: %d\n", getpriority(PRIO_PROCESS, 0));
sched_rr_get_interval(0, &qtm);
fprintf(stderr, "New time quantum(thread 1): %lds %ldns.\n", qtm.tv_sec, qtm.tv_nsec);
...

Редактировать: Версия ОС: 2.6.33.7-rt29-0.5-rt

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

Кажется, что возможность управлять квантом времени в цикле была удалена из планировщика реального времени Linux.

Глядя на источник (kernel/sched_rt.c), счетчик временного среза возвращается к постоянному значению (DEF_TIMESLICE, определенному как 0,1 с), когда он истекает в task_tick_rt(), поэтому изменить его невозможноэто динамически.get_rr_interval() (вызывается sched_rr_get_interval()) всегда возвращает это постоянное значение

Если вам нужны меньшие временные интервалы, я думаю, вам придется делать это самостоятельно с планировщиком FIFO и вызывать sched_yield() в подходящее времяили взломайте ядро ​​в соответствии со своими потребностями.

1 голос
/ 23 октября 2018

В ядре Linux версии 3.9 и новее квант RR можно прочитать и изменить с помощью / proc / sys / kernel / sched_rr_timeslice_ms

Если вы используете ядро ​​версии 2.6.24 или новее, вы не можете использовать"хороший" взломать.

...