我做了一個實驗釘下來,如下所示:
我使用PREEMPT_RT補丁運行2.6.33內核。
要運行實驗,我在一個窗口中運行process2(以root身份),然後在另一個窗口中啓動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);
}
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
哇!這是令人困惑的!總結:
+1爲研究工作! – Haywire 2013-05-09 15:03:38