4

私は Linux カーネルを研究しており、ラウンド ロビン スケジューリング アルゴリズムがどのように機能するかを理解しようとしています。kernel\sched_rt.cファイルには、次のtask_tick_rtように定義されたメソッドがあります。

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)タスク リスト ポインタが 1 減らされている理由がわかりません。pつまり、メソッドが現在のタスクではなく前のタスクをチェックするのはなぜですか? これに関する説明をいただければ幸いです。

4

1 に答える 1

7

C 演算子の優先順位を確認してくださいhttp://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

演算子は->prefix よりも優先順位が高い++ため、この特定の条件は次のように記述できます。

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

つまり、デクリメントされるのはタイムスライスであり、ポインターではありません。


このqueuedパラメータはここでは役に立たないように見えるかもしれませんが、そこにある理由があります。task_tick_rt()がどこから呼び出されるかに特に注意してください。その唯一の参照は、次のインスタンスで.task_tick関数ポインタに割り当てられた場合です: http://lxr.free-electrons.com/source/kernel/sched/rt.c#L1991rt_sched_classstruct sched_class

したがって、各スケジューリング アルゴリズムには、カーネルがスケジューリング サービスのために呼び出す独自のstruct sched_class関数ベクトルがあることがわかります。他のアルゴリズムを見ると、CFS (Completely Fair Scheduling) アルゴリズムにもstruct sched_classという名前の独自のインスタンスがあることがわかりますfair_sched_class: http://lxr.free-electrons.com/source/kernel/sched/fair.c#L6179

CFS ケースの.task_tickメンバーは次を指していtask_tick_fair()ます: http://lxr.free-electrons.com/source/kernel/sched/fair.c#L5785

パラメータを使用することに注意task_tick_fair() queuedてください。したがって、.task_tickメンバーが ( hereおよびhere ) に呼び出されると、パラメーターとして 0 または 1 が渡されqueuedます。したがって、task_tick_rt()それを使用していない間は、パラメーターは依然としてそれらである必要があるため、関数ベクトルqueuedの関数ポインターの型はすべて一致します。struct sched_class

つまり、struct sched_class関数ベクトルは、スケジューリング アルゴリズムと残りのカーネルの間のインターフェイスを指定します。パラメータは、特定のqueuedアルゴリズムがそれを使用することを選択する必要がありますが、ラウンド ロビンの場合は単純に無視されます。

于 2013-10-11T21:12:40.583 に答える