我在研究Linux內核,並試圖弄清楚循環調度算法是如何工作的。在kernel\sched_rt.c
文件中,有一個名爲task_tick_rt
方法是這樣定義的:解開Linux內核調度程序
static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)
{
update_curr_rt(rq);
watchdog(rq, p);
/*
* RR tasks need a special form of timeslice management.
* FIFO tasks have no timeslices.
*/
if (p->policy != SCHED_RR)
return;
if (--p->rt.time_slice)
return;
p->rt.time_slice = DEF_TIMESLICE;
/*
* Requeue to the end of queue if we are not the only element
* on the queue:
*/
if (p->rt.run_list.prev != p->rt.run_list.next) {
requeue_task_rt(rq, p, 0);
set_tsk_need_resched(p);
}
}
什麼我不明白(除了一個事實,即有一個無用queued
參數)是什麼代碼試圖通過if (--p->rt.time_slice)
檢查實現。我不明白爲什麼任務列表指針p
正在遞減1,換句話說,爲什麼檢查先前的任務而不是當前的任務?任何關於此的澄清表示讚賞。
完美的解釋。謝謝你,先生! – user2872534
@DigitalTrauma感謝您對sched_class目的的解釋。我知道有兩個調度策略'SCHED_FIFO'&'SCHED_RR'。但是,查看http://lxr.missinglinkelectronics.com/#linux+v3.10/kernel/sched/rt.c#L1 sched/rt。c,我找不出sched_class如何協助選擇使用哪種策略。 – newprint
@newprint - 請問這是一個新的問題。 –