トップ出力におけるnice値と優先度の違い

トップ出力におけるnice値と優先度の違い

デフォルトでは、両方の列がリストされます。違いが何なのか知りたいです。マニュアルページを確認しましたが、わかりません。

優先度:

   h: PR  --  Priority
      The priority of the task.

素晴らしい価値:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

という事は承知しています素晴らしい価値カーネルのCPUスケジューラキューに関連しています。優先度示していますか? I/O に関するものでしょうか?

答え1

ナイス値は「グローバル」なメカニズムですが、優先度はタスクスイッチャーに関係します。今すぐ

答え2

違いは広報カーネル内のプロセスの現時点での実際の優先度であり、プロセスが持つべき優先度をカーネルに伝える単なるヒントです。

ほとんどの場合広報値は次の式で計算できます。PR = 20 + NIしたがって、niceness 3のプロセスは優先度23(20 + 3)を持ち、niceness -7のプロセスは優先度13(20 - 7)を持ちます。最初のものはコマンドを実行して確認できますnice -n 3 top。次のように表示されます。プロセスはNI 3そして広報23しかし、nice -n -7 topほとんどのLinuxシステムで実行するには、実際には下位の広報値が高ければ高いほど、実際の優先度は高くなります。広報13標準優先度のプロセスよりも優先度が高い広報20そのため、rootになる必要があります。ただし、非rootプロセスに許可される最小nice値は、制限

理論的にはカーネルは変更できる広報価値(ただし) は単独では機能しません。たとえば、CPU を大量に消費するプロセスの場合はプロセスの優先度を下げることがあります。また、他の優先度の高いプロセスのために長時間実行できなかったプロセスの場合は、プロセスの優先度を上げることがあります。このような場合、広報値はカーネルによって変更され、同じままなので、式は「PR = 20 + NI」正しくありません。値はカーネルにとってプロセスが持つべき優先度のヒントとして解釈できるが、カーネルは実際の優先度を選択できる(広報状況に応じて、独自の値(値)を設定する必要がありますが、通常は式「PR = 20 + NI」正しい。

カーネルが優先順位を変更する正確なルールは明確ではありません。優先順位を設定する(nice値を変更する関数) マニュアルには次のように書かれています:

nice 値を変更した場合の効果は、有効なプロセス スケジューリング アルゴリズムによって異なる場合があります。

Pthread マニュアル次のように述べている。

動的優先度は nice 値 (nice(2)、setpriority(2)、または sched_setattr(2) によって設定) に基づいており、スレッドが実行の準備ができているがスケジューラによって実行が拒否される時間量子ごとに増加します。

のようだ広報値は動的優先度に対応します。

の範囲価値は-20..19。したがって、広報値は以下の値を取ることができます0(20 - 20)から39(20 + 19)。ただし、これはデフォルトのスケジューリングポリシーを持つプロセスに対してのみ正しいです(SHED_その他)。いわゆる"リアルタイム"スケジュールポリシー。これらのポリシーはスケジュールそしてスケジューリングFIFOこのようなプロセスには広報値が0未満です。chrt -r 1 topコマンドを実行することで確認できます(rootである必要があります)。プロセスには広報 -2実行することもできます。chrt -r 90 topその場合、プロセスには広報-91

どうやら、スケジュール処理する広報値は次の式で計算できます。

PR = - 1 - sched_rr_priority

したがって、スケジュールプロセスには少なくとも広報 -1つまり、スケジュールプロセスは他のどのプロセスよりも優先されますスケジュール_その他これはpthreadマニュアルに対応しています:

SCHED_FIFO は 0 より大きい静的優先度でのみ使用できます。つまり、SCHED_FIFO スレッドが実行可能になると、現在実行中の SCHED_OTHER、SCHED_BATCH、または SCHED_IDLE スレッドが常に直ちにプリエンプトされます。

SCHED_RRはSCHED_FIFOの単純な拡張です。SCHED_FIFOについて上で説明したことはすべてSCHED_RRにも当てはまります。

リアルタイムプロセスの優先度は、カーネルによって変更できない静的優先度と呼ばれます。したがって、広報値は非リアルタイムの動的優先度として扱うことができる(スケジュール_その他スケジュールバッチ)プロセスと負の広報リアルタイムプロセスの静的優先度としての値(スケジュールスケジューリングFIFO)。

私も走ってみましたnice -n 10 chrt -r 50 top(そしてchrt -r 50 nice -n 10 top)。値は10でしたが、広報まだ-51。だから、値は優先度に影響しませんスケジュールプロセス。これは優先順位を設定するマニュアル:

SCHED_FIFO または SCHED_RR を使用するプロセスまたはスレッドは、setpriority() の呼び出しによる影響を受けません。これはエラーとはみなされません。その後 SCHED_OTHER に戻るプロセスは、このような setpriority() 呼び出しによって優先度が影響を受ける必要はありません。

面白いことに、実行するとchrt -r 99 topRT数値の代わりに値広報カラム。

  PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド
28489 ルート RT 0 2852 1200 896 R 0 0.1 0:00.01 トップ

これは、プロセスが特別になったことを意味するとは思いません。印刷しないだけ-100印刷するには 4 文字必要になるからです。

使用することもできますhトップの代わりにすべての例で、より便利にps -l使用できます。リアルタイムと非リアルタイムの優先度を区別する基準点は0ではなく60なので、次のようにnice -n -20 ps -l印刷されます。

FS UID PID PPID C PRI NI アドレス SZ WCHAN TTY 時間 コマンド
4 R 0 28983 28804 0 60 -20 - 1176 - pts/6 00:00:00 ps

答え3

短い答え

PR は優先度レベルです。PR が低いほど、プロセスの優先度が高くなります。

PRは次のように計算されます。

  • 通常のプロセスの場合: PR = 20 + NI (NI は nice で、範囲は -20 から 19 です)
  • リアルタイムプロセスの場合: PR = - 1 - real_time_priority (real_time_priority の範囲は 1 から 99)

長い回答

プロセスには2種類あります。普通のものやリアルタイム 通常のもの(そしてそれらのみ)の場合、nice は次のように適用されます。

ニース

「niceness」スケールは -20 から 19 までで、-20 が最高の優先度、19 が最低の優先度です。優先度レベルは次のように計算されます。

PR = 20 + NI

ここで、NI は nice レベル、PR は優先度レベルです。ご覧のとおり、-20 は実際には 0 にマッピングされ、19 は 39 にマッピングされます。

デフォルトでは、プログラムの nice 値は 0 ビットですが、root ユーザーは次のコマンドを使用して、指定された nice 値を持つプログラムを起動できます。

nice -n <nice_value> ./myProgram 

リアルタイム

さらに先に進むこともできます。nice 優先度は、実際にはユーザー プログラムに使用されます。UNIX/LINUX 全体の優先度の範囲は 140 ですが、nice 値により、プロセスは範囲の最後の部分 (100 から 139) にマップできます。この式では、0 から 99 の値は到達不可能となり、負の PR レベル (-100 から -1) に相当します。これらの値にアクセスできるようにするには、プロセスを「リアルタイム」として記述する必要があります。

LINUX 環境には 5 つのスケジューリング ポリシーがあり、次のコマンドで表示できます。

chrt -m 

次のリストが表示されます。

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

スケジューリング プロセスは、通常のスケジューリング ポリシー (1 ~ 3) とリアルタイム スケジューリング ポリシー (4 と 5) の 2 つのグループに分けられます。リアルタイム プロセスは常に通常のプロセスよりも優先されます。リアルタイム プロセスは、次のコマンドを使用して呼び出すことができます (この例は、SCHED_RR ポリシーを宣言する方法を示しています)。

chrt --rr <priority between 1-99> ./myProgram

リアルタイム プロセスの PR 値を取得するには、次の式が適用されます。

PR = -1 - rt_prior

ここで、rt_prior は 1 から 99 までの優先度に対応します。そのため、他のプロセスよりも高い優先度を持つプロセスは、番号 99 で呼び出されるプロセスになります。

リアルタイム プロセスでは、nice 値は使用されないことに注意してください。

プロセスの現在の「niceness」と PR 値を確認するには、次のコマンドを実行します。

top

たとえば、PR 値が -51 のプロセスはリアルタイム値に対応することに注意してください。PR 値が「rt」と記載されているプロセスもあります。この値は実際には PR 値 -100 に対応します。

(追記: 上位の結果を示す写真を投稿したかったのですが、私にはそれをするだけの評判がありません)

関連情報