在Linux实时进程优先级范围1到99中,我不清楚哪一个是最高优先级,1还是99。
“理解Linux内核”(O‘’Reilly)第7.2.2节说,1是最高优先级,考虑到正常进程的静态优先级从100到139,其中100是最高优先级,这是有意义的:
每个实时进程都与一个实时优先级相关联,该优先级从1(最高优先级)到99 (最低优先级)不等。
另一方面,sched_setscheduler手册页(RHEL6.1)声称99是最高的:
在一个实时策略(SCHED_FIFO,SCHED_RR)下调度的进程的sched_priority值在1(低)到99 (高)之间。
哪个是最高的实时优先级?
发布于 2012-02-14 22:25:06
我做了一个实验来确定它,如下所示:
我正在使用PREEMPT_RT补丁运行一个2.6.33内核。
为了运行实验,我在一个窗口(作为根)运行process2,然后在另一个窗口中启动process1 (作为根)。其结果是process1似乎抢占了process2,不允许它运行整整10秒。
在第二个实验中,我将流程2的RT优先级改为41。在这种情况下,process2不会被process1抢占。
实验表明,较大的RT优先级值在sched_setscheduler()中具有较高的优先级。这似乎与从调度.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);
}rt_mutex_getprio(p)做了以下工作:
return task->normal_prio;而normal_prio()恰好执行以下操作:
prio = MAX_RT_PRIO-1 - p->rt_priority; /* <===== notice! */
...
return prio;换句话说,我们有(我自己的解释):
p->prio = p->normal_prio = MAX_RT_PRIO - 1 - p->rt_priority哇!这太让人困惑了!概括地说:
sched_setscheduler()的实时优先级集.发布于 2018-09-25 15:29:43
短答案
99将成为实时优先权的赢家。
PR是优先级级别(范围-100到39)。PR越低,流程的优先级就越高。
PR计算如下:
长答案
有两种类型的进程,正常的和实时的(仅对那些),nice被应用于以下几个方面:
尼斯
“好”等级从-20到19,而-20是最高优先级,19是最低优先级。优先级别计算如下:
PR = 20 + NI
其中NI是很好的级别,PR是优先级别。所以我们可以看到,-20实际上映射到0,而19映射到39。
默认情况下,程序尼斯值为0位--通过使用以下命令,根用户可以使用指定的尼斯值午餐程序:
nice -n <nice_value> ./myProgram 实时
我们可以走得更远。这个好的优先级实际上是用于用户程序的。虽然UNIX/LINUX的总体优先级有140个值,但很好的值使进程能够映射到范围的最后一部分(从100到139)。这个方程使0到99之间的值无法达到,这将对应于负PR水平(从-100到-1)。为了能够获得这些价值,应将这一过程表述为“实时”。
LINUX环境中有5种调度策略,可以使用以下命令显示:
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调度过程可分为2组:常规调度策略(1 ~ 3)和实时调度策略(4和5)。实时过程总是比正常进程具有优先级。可以使用以下命令调用实时进程(示例是如何声明SCHED_RR策略):
chrt --rr <priority between 1-99> ./myProgram为了获得实时过程的PR值,应用下列方程:
PR = -1 - rt_prior
其中rt_prior对应于1到99之间的优先级。因此,比其他进程具有更高优先级的进程将是一个编号为99的进程。
重要的是要注意的是,对于实时过程,很好的值是不使用的。
要查看进程的当前“良好”和PR值,可以执行以下命令:
top它显示了以下输出:

在图中显示PR和NI值。注意到PR值-51对应于实时值的过程是很好的。也有一些过程的PR值表示为"rt“。这个值实际上对应于PR值-100。
发布于 2012-02-08 06:51:22
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.
*/注:本部:
p->prio 值倒置:较低的值意味着较高的优先级。
https://stackoverflow.com/questions/8887531
复制相似问题