Linux中哪个实时优先级最高
在Linux实时进程优先级范围1到99中,我不清楚最高优先级是1还是99 “理解Linux内核”(O'Reilly)的第7.2.2节说1是最高优先级,考虑到正常进程的静态优先级从100到139,100是最高优先级,这是有道理的: “每个实时进程都与一个实时优先级相关联,该优先级的值范围为1(最高 优先级)至99(最低优先级)。” 另一方面,sched_setscheduler手册页(RHEL 6.1)声称99是最高的: “根据一个实时策略(SCHED_FIFO、SCHED_RR)调度的进程” sched_优先级值在1(低)到99(高)之间。”Linux中哪个实时优先级最高,linux,linux-kernel,real-time,Linux,Linux Kernel,Real Time,在Linux实时进程优先级范围1到99中,我不清楚最高优先级是1还是99 “理解Linux内核”(O'Reilly)的第7.2.2节说1是最高优先级,考虑到正常进程的静态优先级从100到139,100是最高优先级,这是有道理的: “每个实时进程都与一个实时优先级相关联,该优先级的值范围为1(最高 优先级)至99(最低优先级)。” 另一方面,sched_setscheduler手册页(RHEL 6.1)声称99是最高的: “根据一个实时策略(SCHED_FIFO、SCHED_RR)调度的进程” s
哪个实时优先级最高?您认为正常进程的静态优先级为100到139,这一假设充其量是不稳定的,最坏情况下是无效的。我的意思是:set_scheduler只允许sched_优先级为0(表示动态优先级调度器),sched_OTHER/sched_BATCH和sched_IDLE(从2.6.16起为真) 编程静态优先级仅为SCHED_RR和SCHED_FIFO的1-99 现在,您可能会看到动态调度器在内部使用100-139中的优先级,但是内核在内部管理动态优先级(包括翻转高优先级与低优先级的含义,以便于比较或排序)的操作对于用户空间来说应该是不透明的 请记住,在SCHED_OTHER中,您主要是将进程填充到同一优先级队列中 这样做的目的是使内核更易于调试,并避免愚蠢的越界错误 因此,转换含义的理由可能是,作为内核开发人员,不想使用像139 idx这样的数学(以防idx>139)。。。最好使用idx-100进行数学运算,并将低与高的概念颠倒过来,因为idx<100是众所周知的
另一个副作用是友善变得更容易处理。100-100尼斯==0;101-100尼斯==1;等更容易。它也很好地压缩为负数(与静态优先级无关)99-100nice==-1 要确定可以通过编程方式设置的最高实时优先级,请使用sched_get_priority_max函数 在Linux 2.6.32上,调用sched_get_priority_max(sched_FIFO)返回99 请参见中的这一评论,该评论非常明确:
/*
* Priority of a process goes from 0..MAX_PRIO-1, valid RT
* priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
* tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
* values are inverted: lower p->prio value means higher priority.
*
* The MAX_USER_RT_PRIO value allows the actual maximum
* RT priority to be separate from the value exported to
* user-space. This allows kernel threads to set their
* priority to a value higher than any user task. Note:
* MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
*/
注意这一部分:
优先级值颠倒:较低的
p->prio
值意味着较高的优先级我做了一个实验来确定这一点,如下所示:
- 进程1:RT优先级=40,CPU相关性=CPU 0。此进程“旋转”10秒,因此不会让任何优先级较低的进程在CPU 0上运行
- 进程2:RT优先级=39,CPU相关性=CPU 0。此进程每隔0.5秒向stdout打印一条消息,并在其间休眠。它会打印出每条消息经过的时间
static void
__setscheduler(struct rq *rq, struct task_struct *p, int policy, int prio)
{
BUG_ON(p->se.on_rq);
p->policy = policy;
p->rt_priority = prio;
p->normal_prio = normal_prio(p);
/* we are holding p->pi_lock already */
p->prio = rt_mutex_getprio(p);
if (rt_prio(p->prio))
p->sched_class = &rt_sched_class;
else
p->sched_class = &fair_sched_class;
set_load_weight(p);
}
rt_mutex_getprio(p)执行以下操作:
return task->normal_prio;
prio = MAX_RT_PRIO-1 - p->rt_priority; /* <===== notice! */
...
return prio;
而正常的_prio()会执行以下操作:
return task->normal_prio;
prio = MAX_RT_PRIO-1 - p->rt_priority; /* <===== notice! */
...
return prio;
哇!这太令人困惑了!总结如下:
- 使用p->prio时,较小的值优先于较大的值
- 使用p->rt\u优先级,较大的值优先于较小的值。这是使用sched_setscheduler()设置的实时优先级
Example:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2079 admin 10 -10 280m 31m 4032 S 9.6 0.0 21183:05 mgmtd
[admin@abc.com ~]# renice -n -11 2079
2079: old priority -10, new priority -11
[admin@abc.com ~]# top -b | grep mgmtd
2079 admin 9 -11 280m 31m 4032 S 0.0 0.0 21183:05 mgmtd
^C
希望本实用示例能够澄清疑问,并有助于修复错误来源的单词(如果有)。简短回答 99将是实时优先级的赢家 PR是优先级(范围-100到39)。PR越低,流程的优先级就越高 PR的计算如下:
- 对于正常工艺:PR=20+NI(NI很好,范围从-20到 (19)
- 对于实时进程:PR=-1-实时优先级 (实时优先级范围从1到99)
chrt -m
1. SCHED_OTHER the standard round-robin time-sharing policy
2. SCHED_BATCH for "batch" style execution of processes
3. SCHED_IDLE for running very low priority background jobs.
4. SCHED_FIFO a first-in, first-out policy
5. SCHED_RR a round-robin policy
chrt --rr <priority between 1-99> ./myProgram
top