2013-10-11 129 views
4

我在研究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,換句話說,爲什麼檢查先前的任務而不是當前的任務?任何關於此的澄清表示讚賞。

回答

7

退房C運算符優先級http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

->操作比前綴++的優先級高,所以這一特殊情況可以寫爲:

if (--(p->rt.time_slice)) 

換句話說,它是時間片這正在減少,而不是指針。


queued參數在這裏可能看起來沒用,但它有一個理由在那裏。特別注意,從哪裏調用task_tick_rt()。它唯一的參考是當它被分配到.task_tick函數指針在struct sched_classrt_sched_class實例: http://lxr.free-electrons.com/source/kernel/sched/rt.c#L1991

所以我們看到,每個調度算法都有自己的struct sched_class功能載體,其內核將調用調度服務。如果我們看一下其他的算法,我們看到了CFS(完全公平調度)算法也有自己的struct sched_class例如,名爲fair_sched_classhttp://lxr.free-electrons.com/source/kernel/sched/fair.c#L6179

.task_tick成員在CFS的情況下點task_tick_fair()http://lxr.free-electrons.com/source/kernel/sched/fair.c#L5785

注意task_tick_fair()確實使用queued參數。因此,當調用.task_tick成員(herehere)時,會傳入0或1以表示queued參數。因此,雖然task_tick_rt()不使用它,但參數queued仍然是它們的,因此struct sched_class函數向量中的函數指針類型全部匹配。

簡而言之,struct sched_class函數向量指定調度算法和其他內核之間的接口。 queued參數是應該給定的算法選擇使用它,但在循環的情況下,它被簡單地忽略。

+0

完美的解釋。謝謝你,先生! – user2872534

+0

@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

+0

@newprint - 請問這是一個新的問題。 –