タスクを到着した順番にCPUへ割り当てるスケジューリング方式。
FCFS方式とは、First Come First Served(先に来たものから先に処理する)の略で、タスク(=CPUに処理してほしい仕事)を到着した順番に割り当てるスケジューリング方式のことです。途中で順番を入れ替えず、1つのタスクを最後まで実行してから次へ進むノンプリエンプティブ(=途中で切り替えない)方式です。
身近な例で考えると、スーパーのレジの行列に似ています。先に並んだ人から順にお会計をし、途中で割り込みはしません。並んだ順に処理する、いちばん素直なルールです。
上のツールで▶ボタンを押すと、到着順に並んだA・B・Cが順番に最後まで実行され、ガントチャート(=横軸が時間の実行記録)が左から埋まっていく様子と、各タスクの待ち時間が確認できます。
FCFSの最大の長所は単純さです。具体的には次の利点があります。
・実装が簡単:到着した順に並べた列の先頭から取り出すだけでよく、優先度などの複雑な判断がいらない
・分かりやすく公平:到着順という、だれもが納得しやすい基準で動く
・切替が少ない:1つのタスクを最後まで実行するため、タスクを切り替える準備(コンテキストスイッチ)の回数が少なくて済む
ラウンドロビンのように途中で何度も切り替えたり、優先度方式のように優先順位を計算したりする必要がないため、仕組みを理解しやすく、動作が予測しやすいのが魅力です。スケジューリング方式を学ぶときの出発点としてよく取り上げられます。
FCFSの弱点は、処理時間の長いタスクが先頭にあると、後続のタスクが長く待たされる点です。これをコンボイ効果(高速道路で1台の遅い車の後ろに行列ができる様子)と呼びます。
上のツールの例で平均待ち時間を計算してみましょう。待ち時間=実行を始めた時刻−到着時刻で求めます。
A: 0 − 0 = 0
B: 6 − 0 = 6
C: 8 − 0 = 8
平均 = (0 + 6 + 8) ÷ 3 = 4.6666…
もし処理時間の短いタスクから先に実行していれば、後続の待ち時間が小さくなり、平均待ち時間はもっと短くできます。FCFSは単純で公平な反面、こうした「長いタスクが先頭にいる場合」に弱い、という性質を覚えておきましょう。上のツールで、長いAの後ろでB・Cがじっと待っている様子を確認してみてください。
スケジューリングの評価では、待ち時間と並んでターンアラウンドタイムという指標もよく使われます。これはタスクが到着してから完全に完了するまでの合計時間のことです。
2つの指標の違いは次のとおりです。
・待ち時間:到着〜実行開始までの「待たされた時間」だけ
・ターンアラウンドタイム:到着〜完了までの「丸ごとの時間」(待ち時間+処理時間)
計算式は ターンアラウンドタイム=完了時刻-到着時刻 です。身近な例では、お店に「入店した時刻」から「会計が終わって出た時刻」までの時間と同じ感覚です。待ち行列が長ければターンアラウンドタイムも長くなります。FCFSでは先頭に長いタスクが来ると、後続のターンアラウンドタイムが大きく膨らむのが弱点です。
FCFSとSJFは同じ「ノンプリエンプティブ(途中で切り替えない)」方式ですが、どの順番でタスクをCPUに割り当てるかが大きく違います。
| 項目 | FCFS | SJF |
|---|---|---|
| 実行順の基準 | 到着した順 | 処理時間が短い順 |
| 平均待ち時間 | 長いタスクが先頭だと大きい | 理論上最も短い |
| 実装の難しさ | 簡単(キューに並べるだけ) | 処理時間の予測が必要 |
| 弱点 | コンボイ効果(渋滞) | 飢餓状態(長いタスクが後回し) |
FCFSは「公平で予測しやすい」、SJFは「平均待ち時間が短いが不公平になりうる」というトレードオフがあります。長いタスクが後回しにされ続ける(飢餓状態)を防ぐには、待ち時間に応じて優先度を上げる工夫が必要です。どちらの方式が向いているかは、タスクの性質と何を最優先にするかで変わります。