Dav*_*uer 61 linux real-time linux-kernel
在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_priority值在1(低)到99(高)范围内."
哪个是最高的实时优先级?
Dav*_*uer 80
我做了一个实验来解决这个问题,如下:
process1:RT优先级= 40,CPU亲和力= CPU 0.此进程"旋转"10秒,因此不会让任何低优先级进程在CPU 0上运行.
process2:RT优先级= 39,CPU亲和力= CPU 0.此过程每0.5秒向stdout输出一条消息,介于两者之间.它打印出每条消息的已用时间.
我正在使用PREEMPT_RT补丁运行2.6.33内核.
要运行实验,我在一个窗口(以root身份)运行process2,然后在另一个窗口中启动process1(以root身份).结果是process1似乎抢占了process2,不允许它运行整整10秒.
在第二个实验中,我将process2的RT优先级更改为41.在这种情况下,process2 不会被process1抢占.
此实验表明sched_setscheduler()中较大的 RT优先级值具有较高的优先级.这似乎与Michael Foukarakis从sched.h中指出的内容相矛盾,但事实上并非如此.在内核源代码的sched.c中,我们有:
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);
}
Run Code Online (Sandbox Code Playgroud)
rt_mutex_getprio(p)执行以下操作:
return task->normal_prio;
Run Code Online (Sandbox Code Playgroud)
虽然normal_prio()碰巧执行以下操作:
prio = MAX_RT_PRIO-1 - p->rt_priority; /* <===== notice! */
...
return prio;
Run Code Online (Sandbox Code Playgroud)
换句话说,我们(我自己的解释):
p->prio = p->normal_prio = MAX_RT_PRIO - 1 - p->rt_priority
Run Code Online (Sandbox Code Playgroud)
哇!那令人困惑!总结一下:
使用p-> prio时,较小的值会抢占较大的值.
使用p-> rt_priority时,较大的值会抢占较小的值.这是使用sched_setscheduler()设置的实时优先级.
sched.h中的这条评论非常明确:
/*
* 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.
*/
Run Code Online (Sandbox Code Playgroud)
注意这部分:
优先级值被反转:p->prio值越低意味着优先级越高.
简短答案
99位将是实时优先级的获胜者。
PR是优先级(-100至40)。PR越低,该过程的优先级越高。
PR计算如下:
长答案
有两种类型的进程,正常进程和实时进程。对于正常进程 (仅针对那些进程),nice的应用如下:
好啊
“ niceness”标度从-20到19,而-20是最高优先级,19是最低优先级。优先级计算如下:
PR = 20 + NI
其中NI是好级别,PR是优先级别。正如我们所看到的,-20实际上映射为0,而19映射为39。
默认情况下,程序的nice值是0位,root用户可以使用以下命令来午餐带有指定nice值的程序:
nice -n <nice_value> ./myProgram
Run Code Online (Sandbox Code Playgroud)
即时的
我们可以走得更远。好优先级实际上用于用户程序。UNIX / LINUX总体优先级的范围为140个值,而nice值使进程可以映射到范围的最后一部分(从100到139)。该公式使从0到99的值不可达,这将对应于负PR级别(从-100到-1)。为了能够访问这些值,该过程应称为“实时”。
LINUX环境中有5个调度策略,可以通过以下命令显示:
chrt -m
Run Code Online (Sandbox Code Playgroud)
它将显示以下列表:
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
Run Code Online (Sandbox Code Playgroud)
调度过程可以分为2组,正常调度策略(1至3)和实时调度策略(4和5)。实时过程将始终具有比常规过程更高的优先级。可以使用以下命令来调用实时过程(该示例是如何声明SCHED_RR策略):
chrt --rr <priority between 1-99> ./myProgram
Run Code Online (Sandbox Code Playgroud)
为了获得实时过程的PR值,使用以下公式:
PR = -1-rt_prior
其中rt_prior对应于1到99之间的优先级。因此,比其他进程具有更高优先级的进程将是编号为99的进程。
重要的是要注意,对于实时过程,不会使用nice值。
要查看进程的当前“良好”和PR值,可以执行以下命令:
top
Run Code Online (Sandbox Code Playgroud)
显示以下输出:
在图中显示了PR和NI值。最好注意PR值-51与实时值相对应的过程。也有一些过程的PR值表示为“ rt”。该值实际上对应于-100的PR值。
小智 5
要确定可以以编程方式设置的最高实时优先级,请使用sched_get_priority_max函数.
在Linux 2.6.32上,对sched_get_priority_max(SCHED_FIFO)的调用返回99.
请参见http://linux.die.net/man/2/sched_get_priority_max
| 归档时间: |
|
| 查看次数: |
77150 次 |
| 最近记录: |