このブログでは、struct sched_class rt_sched_class
構造体ます。
rt_sched_class
構造はLinuxカーネルのソースコードのlinux-5.6.18\kernel\sched\rt.c
ソースリアルタイムスケジューリングに関連するコアもソースコードで定義されています。
1. dequeue_task_rt関数(実行キューからプロセスを削除します)
dequeue_task_rt関数の概要:
dequeue_task_rt
この機能は、「スケジュール情報」を更新するために使用 されます。
「実行キュー」(赤黒木)から「リアルタイムスケジューリングエンティティ」 を削除します。sched_rt_entity
次に、削除した「リアルタイムスケジューリングエンティティ」を「実行キュー」(赤黒木)の最後に追加します。
dequeue_task_rt関数の分析:
update_curr_rt(rq);
機能は「スケジュール情報」を更新 、
dequeue_rt_entity(rt_se, flags);
機能は、「実行キュー」(赤黒木)から「リアルタイムスケジューリングエンティティ」を削除し、削除した「 実行キュー」(赤黒木)の最後に「リアルタイムスケジューリングエンティティ」を追加することです。ツリー) ;rt_se
dequeue_pushable_task(rq, p);
役割は、ハッシュプロセスを削除することです。
dequeue_task_rt関数のソースコード:
static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{
struct sched_rt_entity *rt_se = &p->rt;
update_curr_rt(rq);
dequeue_rt_entity(rt_se, flags);
dequeue_pushable_task(rq, p);
}
ソースコードパス: linux-5.6.18 \ kernel \ sched \ rt.c#1381
2つ目は、update_curr_rt関数(スケジュール情報の更新)です。
update_curr_rt(rq);
役割は「スケジュール情報」を更新 することです。
update_curr_rt関数のソースコード:
/*
* Update the current task's runtime statistics. Skip current tasks that
* are not in our scheduling class.
*/
static void update_curr_rt(struct rq *rq)
{
struct task_struct *curr = rq->curr;
struct sched_rt_entity *rt_se = &curr->rt;
u64 delta_exec;
u64 now;
if (curr->sched_class != &rt_sched_class)
return;
now = rq_clock_task(rq);
delta_exec = now - curr->se.exec_start;
if (unlikely((s64)delta_exec <= 0))
return;
schedstat_set(curr->se.statistics.exec_max,
max(curr->se.statistics.exec_max, delta_exec));
curr->se.sum_exec_runtime += delta_exec;
account_group_exec_runtime(curr, delta_exec);
curr->se.exec_start = now;
cgroup_account_cputime(curr, delta_exec);
if (!rt_bandwidth_enabled())
return;
for_each_sched_rt_entity(rt_se) {
struct rt_rq *rt_rq = rt_rq_of_se(rt_se);
if (sched_rt_runtime(rt_rq) != RUNTIME_INF) {
raw_spin_lock(&rt_rq->rt_runtime_lock);
rt_rq->rt_time += delta_exec;
if (sched_rt_runtime_exceeded(rt_rq))
resched_curr(rq);
raw_spin_unlock(&rt_rq->rt_runtime_lock);
}
}
}
ソースコードパス: linux-5.6.18 \ kernel \ sched \ rt.c#994