web-dev-qa-db-ja.com

`ps`の` PRI`列がmanページと矛盾しています

Linuxでスケジューリングの優先順位がどのように機能するかを理解しようとしています。ここに私が持っているものがあります:

  • カーネルは、0から139の範囲の各プロセスの優先度値を使用します。数値が小さいほど、プロセスの優先度が高くなります。
  • 0から99までの優先順位値が予約されており、すべてのユーザースペースプロセスの優先順位は100から139です。
  • LinuxはNiceインターフェースを提供します。これは、ユーザーに公開され、ユーザーが変更できる優先順位です。 Nice値の範囲は-20〜19で、優先度100〜139にマップされます。優先度値と同様に、Nice値が低いほど、プロセスの優先度が高くなります。

私の質問は今です:PRI psの列は何を示していますか?

psのマニュアルページには次のように書かれています。

   pri         PRI       priority of the process.  Higher number means
                         lower priority.

ただし、値の範囲は0〜39であり、19 - Niceと等しいことが経験的にわかっています。

関係を考えると、NicePRI列に示されている優先度の両方が「数値が大きいほど優先度が低い」ということは不可能です。

何が欠けていますか?


この動作を示す例:

root@kali:~# ps -ao pid,comm,pri,Nice
  PID COMMAND         PRI  NI
 6153 cat              19   0
 (···)
root@kali:~# renice -n -10 -p 6153
6153 (process ID) old priority 0, new priority -10
root@kali:~# ps -ao pid,comm,pri,Nice
  PID COMMAND         PRI  NI
 6153 cat              29 -10
 (···)
3
kikones34

_ps -o pri_のPRIは_39 - priority_であり、priorityは_/proc/PID/stat_の18番目のフィールドです。

_proc/PID/stat_のマングルされていないフィールドが必要な場合は、_ps -o priority_を使用して取得できます。

実際の優先度が必要な場合は、_ps -o pri_baz_で取得できます。

その値の他の興味深いマングリングは、_ps -o pri_foo_、_ps -o pri_bar_および_ps -o opri_で取得できます。

私はあなたを子供にしません。ソース はこちら で確認できます。

_/proc/PID/stat_に関する注意:

_/proc/PID/stat_の優先度フィールド(18番目)は、カーネルによって _fs/proc/array.c_ から_task_struct->prio - 100_( を介して) task_prio() ; _MAX_RT_PRIO_ は_100_)として定義されます。

4
mosvy