【Linuxカーネル】リアルタイムスケジューリングクラス✧(リアルタイムスケジューリングクラスコア関数のソースコード分析| dequeue_task_rt関数|実行キューからプロセスを削除)


このブログでは、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

おすすめ

転載: blog.csdn.net/han1202012/article/details/123894142
おすすめ