プロセスとシグナル

INPUT · スライド

順番をゆずる(`nice`)

01 / 07

順番待ちの列がある

この Linux の CPU は1つだよ。つまり、本当に同時に動けるプログラムは1つだけなんだ。

でも前の回で、sleep を3つ同時に走らせたよね。あれはどうなっていたのだろう。

少しずつ順番に回している(1秒に何千回も切り替えている)

速すぎて同時に見えるだけなんだ。カーネルの中に順番待ちの列があって、次に誰を動かすかを決めている。この係を スケジューラ と呼ぶよ。

ふつうは全員が平等に並ぶ。でも、こう思うことがあるでしょう。

> この仕事は急がないから、あとでいい

それを伝える道具が nice だよ。列の中で遠慮させるんだ。

02 / 07

大きいほど遠慮する

nice の値は -20 から 19 までの数だよ。向きに気をつけてね。

-20  ← いちばん強い(われ先に)  0  ← ふつう(既定) 19  ← いちばん遠慮する(どうぞお先に)

大きいほど弱いんだ。ここが直感に反するところだね。

名前で覚えるといいよ。nice は英語で「親切」「気だてがよい」という意味だから、

> nice の値が大きい = とても親切 = 人にゆずる

ということだね。「優先度が高い」という言い方とは向きが逆なので、混ざらないように気をつけてね。

nice が大きい  →  優先度は低いnice が小さい  →  優先度は高い

いまの値は nice とだけ打つと見られるよ。あなたのシェルは 0 のはずだよ。

03 / 07

nice -n で始める

始めるときに値を決めるなら、コマンドの前に付けるよ。

~ $ nice -n 10 sh omoi.sh &

読み方は「10 だけ遠慮させて sh omoi.sh を動かす」だね。-n は number の n だよ。

形はいつもこうだよ。

nice -n 値 実行したいコマンド

nice自分の役目を終えたら、そのコマンドに化けるという珍しい作りをしているよ。だから ps で見ても nice という名前は残っていないんだ。

値を確かめる方法が、この busybox では少し変わっているよ。ps に nice の列が無いので、/proc から読むんだ。

~ $ awk '{print $19}' /proc/84/stat10

/proc/番号/stat19番目が nice の値だよ。前の回で親の番号(4番目)を読んだのと同じ場所だね。

top でも見られるよ。STAT の列に N が立つんだ(SN のように)。

04 / 07

renice で動いているものを変える

もう動きだしたものの値を変えるなら renice だよ。

~ $ sleep 300 &[1] 84~ $ renice 19 84

nice は「これから始めるもの」、renice は「いま動いているもの」だね。

renice は PID で指すよ。ジョブ番号(%1)は使えないので、$!pidof で番号を取るんだ。

~ $ sh omoi.sh &~ $ renice 19 $!

複数まとめても渡せるよ。

~ $ renice 19 $(pidof sleep)

nicerenice で数の意味が違うので、そこだけ注意してね。

nice -n 10 コマンド    いまの値に 10 を足すrenice 19 PID          19 にする(足すのではない)

nice足し算renice書きかえだよ。

05 / 07

上げるのは自由、下げるのは root だけ

ここが大事なところだよ。遠慮する方向にしか動かせないんだ。

~ $ nice -n -5 sleep 30nice: setpriority(-5): Permission denied

マイナスにしようとすると断られたね。

一度上げたものを戻すこともできないよ。

~ $ renice 19 84     通る~ $ renice 5 84      renice: setpriority: Permission denied

一方通行なんだ。

なぜかというと、みんなが自分を優先できたら、優先度という仕組みが意味を失うからだね。「われ先に」と言えるのは root だけ、という決まりになっているんだ。

章7でやった話につながるね。root は全部を通り抜けられる、そのかわり普通の利用者は自分を強くできない。

だから実務でこうなるよ。

自分の重い仕事に遠慮させる    → いつでもできる自分の仕事を優先させる        → 管理者に頼む

覚えるのは前者だけで足りるよ。

06 / 07

効くのは CPU の順番だけ

nice で変わるのは CPU をもらう順番だけだよ。

変わらないものを並べておこう。

変わる変わらない
CPU の順番使えるメモリの量
(混んでいるときの速さ)ディスクの読み書きの速さ
通信の速さ

だから困りごとによっては、nice は効かないんだ。

CPU が満杯(idle が 0%)        → nice が効くメモリが足りない                 → 効かないディスク待ち(io が高い)       → ほぼ効かない

前の回で topidleio を見たのを思い出してね。まず top で何が詰まっているかを見て、CPU なら nice の出番、という順番だよ。

もうひとつ。ひまなときは nice 19 でも全速で動くよ。遠慮するのは混んでいるときだけなんだ。だから「急がない仕事に念のため付けておく」のは損にならないんだね。

07 / 07

さあ、打ってみよう

この回で使うのはこれだけだよ。

nice                     いまの値を見るnice -n 10 コマンド      遠慮させて始めるrenice 19 PID            動いているものを書きかえるawk '{print $19}' /proc/PID/stat   値を読むtop -b -n1               STAT の N を見る

値の向きだけ、もう一度言うね。

0 → 19 に近づける = 遠慮させる(誰でもできる)0 → -20 に近づける = 優先させる(root だけ)

使いどきの例を挙げておくよ。

  • 何時間もかかる動画の変換を、仕事の合間に走らせる
  • バックアップを昼間に走らせる
  • 大量のファイルを固める(章9でやる tar だね)

どれも「終わる時刻が少し遅くてもいい」仕事だね。待てる仕事に遠慮させると、待てない仕事が軽くなるんだ。