スケジューリング — 1つのCPUを、みんなで分け合う

実行したいプロセスは何個もあるのに、CPUのコアは1つ。次に誰を走らせるかを決めるのがスケジューラです。同じ仕事の集まりでも、選び方(方式)を変えるだけで待ち時間も応答の速さも激変する — その様子をガントチャートで動かして確かめます。

1. CPUは1つ、行列は伸びる — 先着順(FCFS)

いちばん素朴な方式がFCFS(First-Come First-Served/先着順)。到着した順に、1つのプロセスを最後まで走らせてから次へ移ります。実行の履歴を横軸=時間で描いた図がガントチャートです。

下のデモは4つのプロセス(かっこ内が実行時間)。長いジョブが先頭だと、後ろの短い仕事がずっと待たされます。チェックを入れて順番を変えてみてください。

先着順のガントチャート — コンボイ効果
上段=実行順に並んだプロセス(赤枠=いま実行中/薄い=完了済み)、下段=ガントチャート。長いP1が先頭のままだと平均待ち時間が大きく、短い順に並べ替えると一気に縮みます。スーパーのレジで、カゴいっぱいの客が先頭にいると全員が待つのと同じ現象です。
POINT — コンボイ効果 FCFS は実装が単純で公平に見えるが、1つの長いジョブが後続の短いジョブを全部足止めしてしまう(=コンボイ効果)。短い仕事を先に片付ければ平均待ち時間は小さくできる — これが最短ジョブ優先(SJF)の発想。
待ち時間 = ターンアラウンド時間 − 実行時間 / ターンアラウンド時間 = 完了時刻 − 到着時刻 「待ち時間」はCPUをもらえず待っていた合計。実行そのものにかかった時間は差し引く。

2. 時間を輪切りにする — ラウンドロビン

ラウンドロビン(RR)は、各プロセスに時間量子(タイムクォンタム) q だけCPUを貸し、使い切ったら強制的に中断して行列の最後尾へ回す方式。全員に少しずつ順番が回るので、対話的な処理でも「固まって待たされる」ことがありません。

下のスライダーで q を変えてみてください。q を小さくすると応答は速くなりますが、切り替え(コンテキストスイッチ)の回数が増えていきます。

ラウンドロビン — 時間量子 q の効き方
3つのプロセス(実行時間 5・3・7、全員 t=0 到着)を q ずつ交代で実行。q が小さいほどガントチャートは細切れになり色が頻繁に入れ替わります=それだけ切り替えの手間(オーバーヘッド)が増える。q を最大にすると中断が起きず、先着順とほぼ同じになります。
注意 — 切り替えはタダではない コンテキストスイッチのたびに、レジスタやページテーブルの情報を退避・復元するオーバーヘッドがかかる。q を小さくしすぎると「切り替えばかりで実際の計算が進まない」状態に。逆に大きすぎると RR の利点(応答の速さ)が消えて FCFS に戻る。ちょうど良い qを選ぶのが腕の見せどころ。

3. 方式を切り替えて比べる — スケジューラ対決

ここが本番。同じプロセス集合に対して、FCFS・ラウンドロビン・優先度の3方式を切り替え、ガントチャートと平均値がどう変わるかを見ます。「🔀 別のプロセス集合」で到着時刻・実行時間・優先度を作り直せます(決定的な乱数なので再現可能)。

3方式を切り替える — レディキューとガントチャート
上=CPU(実行中)とレディキュー(順番待ち)、中=ガントチャート(赤い縦線=現在時刻)、下=平均待ち時間・平均ターンアラウンド・平均応答時間・切替回数。方式ボタンを押し、量子を変え、集合を作り直しながら、数字がどう動くかを観察してください。優先度方式では「数字が小さい=優先」で、低優先度が後回しにされ続ける様子(飢餓)も見えます。

4. トレードオフを数字で見る

方式に「万能の勝者」はありません。RRは応答時間(最初にCPUをもらえるまで)が短く公平ですが、切り替えの分だけ平均待ち・ターンアラウンドは増えることがある。FCFSはその逆になりがち。下の棒グラフは、いま画面に出ているプロセス集合での3方式の平均値です(上のカードと連動)。

方式ごとの平均値くらべ(上のカードと連動)
橙=平均待ち時間、青=平均ターンアラウンド、緑=平均応答時間。上のカードで選んでいる方式が枠でハイライトされます。RRは緑(応答)が低く出やすく、FCFSは緑が高くなりがち — この「速さ」と「公平さ」の交換こそがスケジューリングの本質です。
平均待ち時間 = (Σ 待ち時間) / N / CPU利用率 = 実行時間の合計 / 全経過時間 評価尺度は1つではない。「スループット重視の計算サーバ」と「応答重視の対話端末」では、最適な方式も q も変わる。

5. まとめ — 目的が方式を決める

一歩先へ — 実OSのスケジューラ Linux の CFS(Completely Fair Scheduler)やその後継 EEVDF は、単純な行列ではなく「これまでに各プロセスがどれだけCPUを使ったか」を赤黒木で管理し、最も割を食っているプロセスに次を回す。優先度は「重み」として時間配分に効く。さらに対話タスクを優先する工夫や、マルチコアでの負荷分散が重なって、体感のなめらかさが作られている。根っこにあるのは、このレッスンで見た「公平さ ⇄ 応答 ⇄ スループット」の綱引きそのものだ。