FE EXAM

OSのスケジューリング(FCFS / SJF / ラウンドロビン)

OS が複数プロセスに CPU をどう割り振るかをガントチャートで比較。同じプロセスでもアルゴリズム次第で平均待ち時間が変わります。

SCHEDULER
P1
P2
P3
方式
FCFS
総実行時間
9
平均待ち時間
3.33
平均ターンアラウンド
6.33
アルゴリズム
時間t = 0 / 9
t = 0P1 が実行中t = 0〜1 の時間帯。P1 が CPU を使用中。準備完了キュー: 空
プロセス情報と統計
プロセス到着実行時間完了時刻ターンアラウンド待ち時間
P105550
P213874
P321976
解説

📌
スケジューリングとは — CPU の配分ルール

準備完了プロセススケジューラCPU

スケジューリングとは、複数のプロセスに CPU をどう割り振るかのルールです。CPU は1コアでは同時に1プロセスしか実行できないので、誰を先にやるか・どう交代するかを OS のスケジューラが決めます。

身近な例えだと、「銀行の窓口」のような状況です。1人の窓口係(CPU)と複数の客(プロセス)。整理券順に呼ぶ(FCFS)、用件の短い順から処理する(SJF)、1人あたり3分で順に交代する(ラウンドロビン)── どのルールを採用するかで「平均待ち時間」や「公平さ」が変わります。

上のツールでアルゴリズムを切替えると、同じプロセス集合でも結果が大きく変わることを確認できます。

📌
FCFS(先着順) — 一番シンプル

FCFS(First Come First Served)は、到着した順に CPU を渡す最もシンプルな方式です。実装も簡単で、公平に見えますが、欠点もあります。


長所:実装が簡単、順番が予測可能、公平
短所:先頭に長いプロセスがあると、後ろの短いプロセスが長く待たされる(コンボイ効果

上のツールで FCFS を選ぶと、P1(実行時間5)が先頭にあるため P2 と P3 が長く待たされる様子が確認できます。平均待ち時間: 3.33

📌
SJF(最短ジョブ優先) — 平均待ち時間が最小

SJF(Shortest Job First)は、残り実行時間が最短のプロセスを優先する方式です。平均待ち時間が理論上最小になることが数学的に証明されています。


長所:平均待ち時間が最小、短いジョブが速く終わる
短所:実行時間を事前に知る必要がある(通常は予測値を使う)、長いジョブが永遠に待たされる飢餓問題

上のツールで FCFS から SJF に切替えると、平均待ち時間が3.33 → 2.67に改善することを確認できます。短い P3 を先に処理する効果です。

📌
ラウンドロビン — 公平に交代制

ラウンドロビン(RR)は、一定の時間量子(タイムクォンタム)で順番に交代する方式です。プリエンプティブ(強制的に CPU を取り上げる)なため、対話型システムに向きます。


長所:全プロセスが等しく CPU を使える、応答性が良い、飢餓が起きない
短所:コンテキストスイッチが頻繁に起き、オーバーヘッドが増える

時間量子の選び方が重要:
大きすぎると FCFS と同じ動きになる
小さすぎるとコンテキストスイッチのコストが目立つ
・実用的には10〜100msくらいが採用されることが多い

上のツールで「ラウンドロビン(量子=2)」を選ぶと、プロセスが2単位ずつ細かく交代する様子を確認できます。

📌
評価指標 — 待ち時間とターンアラウンド

指標定義計算式
待ち時間CPU を使えずに準備完了で待っていた合計時間= ターンアラウンド − 実行時間
ターンアラウンドタイム到着から完了までの全期間= 完了時刻 − 到着時刻
スループット単位時間あたりに完了するプロセス数= 完了プロセス数 / 経過時間

スケジューリングの評価には複数の指標があります。代表的に計算で求めるのは主に待ち時間とターンアラウンドタイムです。

ポイント:待ち時間 = ターンアラウンド − 実行時間。つまり「全体の経過時間」から「実際に CPU を使っていた時間」を引いたものです。上のツールのプロセス情報テーブルでこの計算結果を確認できます。

📌
プリエンプティブとノンプリエンプティブ

方式実行中の割り込み代表アルゴリズム
ノンプリエンプティブあり得ない(自発的に手放すまで占有)FCFS、SJF(非プリエンプティブ版)
プリエンプティブあり(OS が強制的に CPU を取り上げる)ラウンドロビン、優先度方式

スケジューリング方式はプリエンプティブ(横取り可)ノンプリエンプティブ(横取り不可)に大別されます。


ノンプリエンプティブ:いったん CPU を渡したら、プロセスが自発的に I/O 要求するか終わるまで取り上げない。実装はシンプルだが、応答性が悪い
プリエンプティブ:タイマーや高優先度プロセスの登場で強制的に切替。応答性が良いが、コンテキストスイッチのコストが増える

現代のデスクトップ OS(Windows / macOS / Linux)はすべてプリエンプティブです。1つのアプリが固まっても他のアプリは動き続けるのはそのおかげです。

📌
方式ごとの比較 — どれを選ぶか

方式平均待ち時間応答性飢餓向いている用途
FCFS大きい低いなしバッチ処理(まとめて実行)
SJF最小(理論値)中程度あり短いジョブが多い場面
ラウンドロビン中程度高いなしWebやアプリの操作など対話型
優先度方式優先度次第高優先は高いありリアルタイム処理・重要度が決まっている場合

「どれが一番良いか」は場面によって変わります。トレードオフ(一方を良くすると別の何かが悪くなる関係)があるからです。
平均待ち時間を最小にしたいなら SJF。ただし事前に実行時間を知る必要がある
公平に全プロセスへ応答したいなら ラウンドロビン
重要な処理を先に終わらせたいなら 優先度方式。ただし低優先のタスクは後回しになる

飢餓(starvation)とは、あるプロセスがずっと CPU をもらえないまま待ち続ける状態のことです。SJF では長いプロセスが、優先度方式では低優先度のプロセスが飢餓に陥りやすいため、動的に優先度を上げるエイジングという対策が使われます。上のツールで方式を切り替えながら表の内容と結果を照らし合わせてみてください。

📌
待ち時間の求め方 — 手順を追って計算

FCFS の例(P1:5, P2:3, P3:1)P1P2P30589P1 待ち時間 = 開始(0) - 到着(0) = 0P2 待ち時間 = 開始(5) - 到着(1) = 4P3 待ち時間 = 開始(8) - 到着(2) = 6 平均 = (0+4+6)/3 = 3.33

待ち時間を求める手順は次のとおりです。
ステップ1:ガントチャートをもとに各プロセスの開始時刻を読み取る
ステップ2待ち時間 = 開始時刻 − 到着時刻で各プロセスの待ち時間を計算する
ステップ3:全プロセスの待ち時間を合計してプロセス数で割ると平均待ち時間が出る

上の図の例(FCFS)で確認します。P1 は到着してすぐ実行されるので待ち時間は 0。P2 は t=1 に到着したが P1 が終わる t=5 まで待つので待ち時間は 5 − 1 = 4。P3 は t=2 到着で t=8 開始なので 8 − 2 = 6。平均は (0 + 4 + 6) ÷ 3 = 3.33 です。上のツールのプロセス情報テーブルに同じ数値が表示されているので照らし合わせてみてください。

練習問題

🎯
基本情報技術者 練習問題

Q1.平均待ち時間が理論上最小になるスケジューリング方式はどれか。
A.FCFS(先着順)
B.SJF(最短ジョブ優先)
C.ラウンドロビン
D.優先度方式
Q2.ラウンドロビン方式の特徴として正しいものはどれか。
A.実行時間が最短のプロセスを優先する
B.一度実行を開始したら最後まで CPU を独占する
C.一定の時間量子(タイムスライス)で交代しながら順に実行する
D.優先度が高いプロセスから順に実行する
Q3.プロセス P1(到着0,実行5), P2(到着1,実行3), P3(到着2,実行1) を FCFS で実行したとき、P3 の待ち時間はいくつか。
A.0
B.4
C.6
D.7

関連コンテンツ