Linuxのプロセス優先度には、大きく分けて2つあります。

静的優先度 (リアルタイムプロセス)と動的優先度です。

Linuxカーネルの内部では、優先度は1~139で表現され、1~99が静的優先度、100~139が動的優先度になり、値が低い方が優先度が高くなり、動的優先度はカーネルにより動的に変更されます。

静的優先度は、スケジューラにFIFOとRR(ラウンドロビン)の2種類選択することができ、FIFOは一度CPUをつかむとCPUを離すまでずっと使い続けることができ、RRは同じ優先度のプロセスがあると、ラウンドロビンでCPUが割り当てられます。しかし、どちらのスケジューラを選択しても、優先度の低いプロセスにはCPUが割り当てられないので、設定するには注意が必要で、最悪PCがフリーズしたような状態になります。

優先度を表示するコマンドにより、この優先度の表現が異なるため注意が必要です。

まず chrt コマンドでは、動的優先度は、優先度"0" と表示されます。

# chrt -p 4507
pid 4507's current scheduling policy: SCHED_OTHER
pid 4507's current scheduling priority: 0

静的優先度は以下のように表示されますが、chrtコマンドの場合、数字が大きい方が優先度が高く、1~99 で表示され、99 が最高優先度、つまり カーネル内部では優先度1となります。

# chrt -p 2
pid 2's current scheduling policy: SCHED_FIFO
pid 2's current scheduling priority: 99

topコマンドでは、PR,という列で表示されます。PR では、-100 ~ -2 が動的優先度、0~39 が静的優先度で、数字が小さい方が優先度が高く、-100 が カーネル内部では優先度1となり、-100の場合だけ、実際には"RT"と表示されます。動的優先度は、0がカーネル内部では100となり、39がカーネル内部では139となります。

# top
top - 14:39:35 up  5:07,  3 users,  load average: 0.01, 0.05, 0.03
Tasks: 120 total,   1 running, 118 sleeping,   0 stopped,   1 zombie
Cpu(s):  1.1%us,  1.7%sy,  0.9%ni, 94.1%id,  2.0%wa,  0.1%hi,  0.1%si,  0.0%st
Mem:    799240k total,   750912k used,    48328k free,    23076k buffers
Swap:  2096472k total,      116k used,  2096356k free,   424340k cached PID USER
               PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
~ 省略 ~
   2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
4507 root      16   0 70524 1712 1260 S  0.0  0.2   0:00.30 bash
~ 省略 ~

ちなみに、カーネル内部120が、プロセスのデフォルトの優先度で、nice コマンドでは動的優先度を現在の優先度から相対的に-20 ~ +19 の範囲で設定できます。 ※動的プロセスをniceコマンドで相対的に-20に設定しても、カーネル内部で99以下(リアルプロセス)になることはありません。

ps コマンドでは、-o  rtprio と pri と priority と3つもの表現があり、かなり分かりづらいです。rtprio では静的優先度しか表示できず、1~99 で表現され、数字が大きいほうが優先度が高く、pri では0~39 が動的優先度、41~139 が静的優先度となり、数字が大きい方が優先度が高くなります。最後のpriority では、 0~39 が動的優先度、-100~-2 が静的優先度となり、数字が小さい方が優先度が高くなります。さらにpri と priorityは列の表示名が同じで区別つかないです。ややこしすぎる!!

# ps -eo pid,comm,rtprio,pri,priority
 PID COMMAND         RTPRIO PRI PRI
   2 migration/0         99 139 -100
4507 bash                 -  23  16

まとめると、以下のようになります。

カーネル内部 chrt top (PRI) ps (rtprio) ps (pri) ps (priority) niceコマンドでの設定
1 99 RT 99 139 -100
2 98 -99 98 138 -99
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
99 1 -2 1 41 -2
100 0 0 - 39 0 -20
・ ・ 0 ・ ・ - ・ ・ ・ ・
120 0 20 - 19 20 一般プロセスのデフォルト
・ ・ 0 ・ ・ - ・ ・ ・ ・
139 0 39 - 0 39 +19