違いは PR カーネルと NI 内のプロセスの現時点での真の優先度です。 プロセスが持つべき優先度は、カーネルに対する単なるヒントです。
ほとんどの場合、PR 値は次の式で計算できます:PR =20 + NI .したがって、niceness 3 のプロセスは優先度 23 (20 + 3) を持ち、niceness -7 のプロセスは優先度 13 (20 - 7) を持ちます。コマンド nice -n 3 top
を実行することで最初のものを確認できます . トップが表示されます プロセスには NI 3 があります および PR 23 .しかし、 nice -n -7 top
を実行するために ほとんどの Linux システムでは、実際には PR が低いため、root 権限が必要です。 値は、実際の優先度が高いほどです。したがって、PR 13 のプロセス 標準優先度のプロセスよりも優先度が高い PR 20 .そのため、root になる必要があります。ただし、ルート以外のプロセスに許可される最小ナイスネス値は、/etc/security/limits.conf で構成できます。 .
理論的には、カーネルは PR を変更できます 値 (ただし、NI は除く) ) 単独で。たとえば、CPU の消費量が多すぎるプロセスの優先度を下げたり、他の優先度の高いプロセスが原因でそのプロセスが長時間実行される機会がなかった場合にそのプロセスの優先度を上げたりします。このような場合、PR 値はカーネルと NI によって変更されます 同じままなので、式 "PR =20 + NI" は正しくありません。つまり、NI 値は、プロセスが持つべき優先度に関するカーネルのヒントとして解釈できますが、カーネルは実際の優先度を選択できます (PR 値)状況に応じて独自に。しかし、通常 「PR =20 + NI」 という式 正解です。
カーネルが優先度を変更する正確なルールは明確ではありません。 優先順位を設定 (nice 値を変更する関数) マニュアルには次のように書かれています:
<ブロック引用>nice 値を変更した場合の効果は、有効なプロセス スケジューリング アルゴリズムによって異なります。
Pthread のマニュアルには次のように書かれています:
<ブロック引用>動的優先度は、nice 値 (nice(2)、setpriority(2)、または sched_setattr(2) によって設定される) に基づいており、スレッドの実行準備が整うたびに増加しますが、スケジューラによって実行が拒否されます。 /P>
PR 値は動的優先度に対応します。
NIの範囲 値は -20..19 です .したがって、PR 値は 0 からの値を持つことができます (20 - 20) から 39 (20 + 19)。ただし、デフォルトのスケジューリング ポリシー (SHED_OTHER) を持つプロセスに対してのみ正しいです。 )。いわゆる「リアルタイム」のプロセスもあるかもしれません スケジューリング ポリシー。これらのポリシーは SCHED_RR です および SCHED_FIFO .このようなプロセスには PR があります chrt -r 1 top
を実行すると、これを確認できます。 コマンド(ルートである必要があります)。 トップ プロセスの PR -2 . chrt -r 90 top
を実行することもできます この場合、トップ プロセスの PR -91 .
SCHED_RR のようです PR を処理します 値は次の式で計算できます:
PR =- 1 - sched_rr_priority .
したがって、SCHED_RR プロセスには少なくとも PR -1 があります つまり、SCHED_RR プロセスはどの SCHED_OTHER よりも優先度が高い .これは pthread マニュアルに対応します:
<ブロック引用>SCHED_FIFO は、0 よりも高い静的優先度でのみ使用できます。つまり、SCHED_FIFO スレッドが実行可能になると、現在実行中の SCHED_OTHER、SCHED_BATCH、または SCHED_IDLE スレッドを常にすぐに横取りします。
SCHED_RR は、SCHED_FIFO を単純に拡張したものです。上記の SCHED_FIFO の説明はすべて SCHED_RR にも適用されます。
リアルタイム プロセスの優先度は、カーネルによって変更できない静的優先度と呼ばれます。とてもポジティブな PR 値は、非リアルタイムの動的優先度として扱うことができます (SCHED_OTHER 、SCHED_BATCH ) プロセスと否定的な PR リアルタイム プロセスの静的優先度としての値 (SCHED_RR 、SCHED_FIFO ).
nice -n 10 chrt -r 50 top
も実行しようとしました (そして chrt -r 50 nice -n 10 top
)。 NI 値は 10 でしたが、PR まだ -51 だった . NI 値は SCHED_RR の優先度には影響しません プロセス。これは、setpriority に対応します マニュアル:
SCHED_FIFO または SCHED_RR を使用するプロセスまたはスレッドは、setpriority() の呼び出しの影響を受けません。これはエラーとは見なされません。その後 SCHED_OTHER に戻るプロセスは、そのような setpriority() 呼び出しの影響を受ける優先度を持つ必要はありません。
面白いメモを 1 つ。 chrt -r 99 top
を実行した場合 、RT が表示されます PR の数値ではなく値
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28489 root RT 0 2852 1200 896 R 0 0.1 0:00.01 top
これは、プロセスが特別になったという意味ではないと思います。これはトップという意味だと思います -100 を印刷しないでください 印刷するのに 4 文字かかるからです。
htop を使用することもできます トップの代わりに すべての例で、より便利になる可能性があります。 ps -l
も使用できますが、リアルタイム優先度と非リアルタイム優先度を分ける基点は 0 ではなく 60 なので nice -n -20 ps -l
印刷します
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 R 0 28983 28804 0 60 -20 - 1176 - pts/6 00:00:00 ps
nice 値は「グローバル」メカニズムですが、優先度はタスク スイッチャーに関連しています。現在 .