Linuxカーネルは、プロセスをスケジュールするためにウェイト値をどのように使用しますか?

Linuxカーネルは、プロセスをスケジュールするためにウェイト値をどのように使用しますか?

「Linux Kernel Development」を読んでいますが、プロセスの重み値を理解していません。 Linuxカーネルでは、各プロセスはnice値を持ち、nice値は重みにマップされます。

  • 重量は「プロセッサ時間の割合」だと思います。これは、プロセスに割り当てられた実行時間が対応する重み/(すべてのプロセスの総重み)*(プロセッサ時間)であることを意味します。上記の式の結果が10%であるが、プロセスの実際の実行時間が10%未満の場合、優先順位が与えられます。正しいですか?
  • cfsがどのようにチェックするのか混乱しています。 cfsは、プロセスのランタイムを定期的に確認(例:1ms)して更新し、実際のランタイム/プロセスに割り当てられたランタイムの割合を選択した最小値と比較して実行しますか?しかし、使用されている機能のいくつかをリストできますか?

答え1

set_load_weightLinuxカーネルのソースコードで機能を確認してください。ここでは、スケジューリングオブジェクト(作業/作業グループ)の実際の負荷を計算します。このルーチンは、さまざまな場所(フォークやユーザースペースで新しい良い値を設定するときなど)から呼び出されます。

if (update_load && p->sched_class == &fair_sched_class) {
    reweight_task(p, prio);
} else {
    load->weight = scale_load(sched_prio_to_weight[prio]);
    load->inv_weight = sched_prio_to_wmult[prio];
}

sched_prio_to_weight優先順位による重みを含みます。

作業重み情報を保持する構造はですstruct load_weight。この構造は、cfsからエンティティのロードを取得し、ジョブのvruntimeRuntime()ルーチンを更新するために使用されますupdate_curr。 cfsは実行する次のタスクを選択しますpick_next_task。以下はコードの断片です。

for_each_class(class) {
        p = class->pick_next_task(rq, prev, rf);
        if (p) {
            if (unlikely(p == RETRY_TASK))
                goto again;
            return p;
        }
    }

ここでは、各予約クラスを調べて、実行するタスクを確認します。

関連情報