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 |