Linuxカーネルは2つの独立した優先順位範囲を実装します。 1 つ目は適切な値で、-20 から +19 までの数値で、デフォルト値は 0 です。
Nice値はすべてのUnixシステムで使用される標準の優先順位の範囲ですが、さまざまなUnixシステムではこれをさまざまな方法で適用します。
私が知りたいのは、処理後に割り当てる良い値を計算するためにどのパラメータが使用されるかです。
時間をいただきありがとうございます。
答え1
その背後にある数字を正確に知らせるという式はありません。これはすべて、カーネルスケジューラ側の特定の実装によって異なります。
詳細に興味がある場合は、基本的なLinuxカーネルスケジューラの優先順位ロジックを確認できます。ここ。
今後の訪問者のためにコピーして貼り付けます(リンクが数年以内に期限切れになる場合)。
優先順位
すべてのプロセスには2つの優先順位が関連付けられています。一つはプロセスの美しい価値です。範囲は-20から19まで、デフォルトは0です。 nice値が低いほど優先順位が高くなります。 nice値が5(プロセス1)と10(プロセス2)のプロセスが2つある場合、プロセス1の優先順位は高くなります。
シェルの ps -el コマンドを使用して、プロセスの良い値を確認できます。カーネル空間では、MAX_RT_PRIORITY+20+OK 値に変換されます。 task_struct の static_prio フィールドに保存されます。
2番目の優先順位はリアルタイム優先順位です。彼らは反対の概念を持っています。つまり、値が高いほどプロセスの優先順位が高くなります。範囲は0から100です。
task_structにはprioというフィールドもあります。このフィールドには、優先順位の反転などの状況を回避するために、スケジューラが優先順位を上げたりブロックしたりすることを検討しているプロセスの有効優先順位が格納されます。
初期のスケジューラでは、優先順位値を使用して、次のプロセスとプロセッサで取得できるタイムスライスを決定しました。このアプローチには多くの欠点があり、これはRobet Loveの著書「Linux Kernel Development」でよく説明されています。
CFSは、プロセスがプロセッサにかかる絶対時間を決定するために優先順位を使用するのではなく、システムの全負荷に基づいてプロセスがプロセッサに費やすプロセッサ時間の割合を計算します。プロセスが必要なデータより少ないデータを取得すると、最終的にRBツリーの左側に移動してプロセッサ時間を取得します。