vruntime は、プロセスが実行された時間を追跡するのに役立つプロセスの仮想ランタイムです。 vruntime は、include/linux/sched.h で定義されている sched_entity 構造のメンバーです
min_vruntime は、cfs runqueue の最小 vruntime を表します。これは、その cfs runqueue でスケジュールされているプロセスのすべての vruntime の最小値を表します。 min_vruntime は、include/linux/sched.h で定義された cfs_rq 構造体のメンバーです
min_vruntime の目的は、実行する cfs runqueue 内の次のプロセスを選択することです。すべてのプロセスに公平を期すために、CFS スケジューラは最初に実行する最小の vruntime を持つプロセスを選択します。
include/linux/sched.h へのリンクは次のとおりです:https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h
vruntime はスレッドごとです。これは、task_struct 内にネストされたメンバーです。
基本的に、vruntime はスレッドの「実行時間」、つまりスレッドがプロセッサで費やした時間の尺度です。 CFS の要点は、すべての人に公平であることです。したがって、アルゴの種類は単純なものに要約されます。(特定のランキューのタスクの中で) vruntime が最も低いタスクは、実行する価値があるタスクであるため、「次」として選択します。 (実際の実装は、効率のために rbtree を使用して行われます)。
優先度、nice 値、cgroup などのさまざまな要因を考慮すると、vruntime の計算は、単純なインクリメントほど単純ではありません。 「Professional Linux Kernel Architecture」、Mauerer、Wrox Press の関連セクションを読むことをお勧めします - 非常に詳細に説明されています。
以下に、これを要約した簡単な試みを示します。
その他のリソース:Documentation/scheduler/sched-design-CFS.txt
クイック サマリー - vruntime の計算: (本に基づく)
-
ほとんどの作業は kernel/sched_fair.c:__update_curr() で行われます
-
タイマー刻みで呼び出されます
-
「現在」がプロセッサで費やした物理時間と仮想時間を更新します
-
デフォルトの優先度 (nice 値 0) で実行されるタスクの場合、費やされる物理時間と仮想時間は同じです
-
他の優先度 (nice) レベルのタスクではそうではありません。したがって、vruntime の計算は、負荷の重み係数を使用して現在の優先度の影響を受けます
delta_exec =(unsigned long)(now – curr->exec_start);// ...delta_exec_weighted =calc_delta_fair(delta_exec, curr);curr->vruntime +=delta_exec_weighted;
いくつかの丸めとオーバーフロー チェックを無視して、calc_delta_fair が行うことは、次の式で与えられた値を計算することです:
delta_exec_weighed = delta_exec * (NICE_0_LOAD / curr->load.weight)
問題は、より重要なタスク (nice 値が低いタスク) の重みが大きくなるということです。したがって、上記の式により、それらに計上される vruntime はより小さくなります (したがって、それらは rbtree の左側により多くエンキューされます!)。