私は 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
つまり、メソッドが現在のタスクではなく前のタスクをチェックするのはなぜですか? これに関する説明をいただければ幸いです。