我正在SUSE Linux Real Time上编写一个C++程序,并试图收集有关其循环调度(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()更改了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
发布于 2011-07-22 23:27:22
似乎已经从Linux实时调度程序中删除了控制循环时间段的功能。
查看源文件(kernel/sched_rt.c),当时间片计数器在task_tick_rt()中过期时,它会恢复为一个常量值(DEF_TIMESLICE,定义为0.1s),因此无法动态更改它。get_rr_interval() (由sched_rr_get_interval()调用)始终返回该常量值
如果您需要较小的时间片,我猜您必须自己使用先进先出调度程序并在适当的时间调用sched_yield(),或者修改内核以满足您的需求。
发布于 2018-10-23 08:23:04
在Linux内核版本3.9和更高版本中,可以使用/proc/sys/ kernel /sched_ RR _timeslice_ms读取和更改rr量程
如果你使用的是2.6.24或更高版本的内核,你就不能使用“很好”的方法。
https://stackoverflow.com/questions/6763386
复制相似问题