優先度
nice 値は毎回のように出る割に、覚えることが少ない分野です。押さえるのは3点だけです。範囲は -20 から 19 まで、数字が小さいほど優先度が高い、既定値は 0 です。
数字の向きが直感と逆です
ここが唯一の引っかけどころです。nice という語は「お人好し」の意味で、nice 値を大きくするほど他のプロセスに CPU を譲るお人好しになる、と覚えると向きを間違えません。優先度が高いのは -20 側です。
もう1つ、一般ユーザーは nice 値を大きくする方向にしか変更できないことも頻出です。優先度を下げる操作は誰でもできますが、上げる操作、つまり数字を小さくする操作には root 権限が要ります。一度大きくした値を元に戻すのも数字を小さくする操作なので、一般ユーザーにはできません。この非対称が試験で問われます。
nice と renice の使い分け
| コマンド | 対象 | 例 |
|---|---|---|
nice | これから起動するコマンド | nice -n 10 command |
renice | すでに動いているプロセス | renice -n 5 -p 1234 |
nice は起動時に nice 値を指定します。-n を省いて nice command と書くと既定で 10 が加算されます。ここも問われます。指定した nice 値は子プロセスにも引き継がれるので、nice -n 10 make と書けば make が呼ぶコンパイラまで一緒に譲る側へ回ります。
紛らわしいのが nice -10 command という古い書き方で、これは「10 を加算」の意味です。「10 を減算」は nice -n -10 と書きます。
renice の対象指定は3通りで、-p PID がプロセス ID、-u ユーザー名 がそのユーザーの全プロセス、-g がプロセスグループ単位です。
そして renice は指定した値を絶対値として設定します。nice が現在値への加算であるのに対し、renice -n 5 は結果として nice 値が 5 になります。この違いも出題されます。
ターミナル
renice -n 5 -p 1234root なら renice -n -5 -p 1234 のように数字を下げる方向へも変更できますが、一般ユーザーが同じことをすると権限が足りない旨のエラーになります。
確認する方法
ターミナル
ps -eo pid,ni,comm
ps -o ni= -p 1234ps の ni 列が nice 値です。ps -o ni= -p PID のように末尾に等号を書くと見出し行が出なくなり、スクリプトで値だけを取り出したいときに便利です。
top の画面では NI 列が nice 値、PR 列が実際の実行優先度です。PR は NI から計算される内部の値なので、両者は別物です。この2列を取り違えさせる選択肢が出ます。
よくある引っかけ
nice 値が大きいほど優先度が高い、という選択肢は誤りです。範囲を -19 から 20 とする選択肢や 0 から 39 とする選択肢もよく混ぜられます。正しくは -20 から 19 で、負の側が優先されます。
一般ユーザーが自分のプロセスなら自由に上げ下げできる、という選択肢も誤りです。数字を大きくする方向にしか動かせません。
nice -n 10 を「nice 値を 10 減らす」と読ませる選択肢も出ますが、加算の向きです。