各タスクに一定時間ずつ順番にCPUを割り当てるスケジューリング方式。
ラウンドロビン方式とは、待っているタスク(=CPUに処理してほしい仕事)に対して、一定の時間(タイムスライス、またはクォンタムと呼ぶ)を順番に割り当て、満了したら次のタスクへ回すスケジューリング方式のことです。
身近な例で考えると、みんなで1台の遊具を交代で使うのに似ています。「1人3分まで」と決めておき、時間が来たら次の人に交代し、まだ遊び足りない人は列の最後尾に並び直す。こうすると全員が順番に遊べます。
上のツールで▶ボタンを押すと、レディーキューの先頭のタスクがタイムスライスぶんだけ実行され、満了すると最後尾へ回り、ガントチャート(=横軸が時間の実行記録)に切替が刻まれていく流れを確認できます。
タイムスライスとは、1回の順番で1つのタスクに与える時間の上限です。仕組みは次のとおりです。
・満了で強制切替:タイムスライスを使い切ると、まだ途中でもプリエンプション(=強制的にCPUを取り上げる)が起き、実行が止まる
・最後尾へ回す:未完了のタスクはレディーキューの最後尾に並び直し、次の順番を待つ
・完了なら外れる:残り時間が0になったタスクは、キューから外れて終了する
タイムスライスの長さは性能に大きく影響します。
・短すぎる場合:交代の回数が増え、タスクを切り替える準備(コンテキストスイッチ)のコストがかさんで効率が落ちる
・長すぎる場合:途中での切替がほとんど起きず、結局は到着順(FCFS)方式に近づいてしまう
ラウンドロビン最大の長所は公平性です。全タスクが順番に同じだけの時間を得られるため、特定のタスクだけが長く待たされる、ということが起こりにくくなります。
この性質は、人が画面を操作してすぐ反応がほしい対話的処理(=Webやアプリの操作など)に向いています。どのタスクも短い周期で必ず順番が回ってくるので、「自分の操作だけ全然反応しない」という事態を避けられるからです。
ただし公平さの代償として、タイムスライスが短すぎると切替コストが増え、逆に長すぎると到着順(FCFS)方式に近づいて公平性のうまみが薄れます。適切な長さを選ぶことが大切です。上のツールで、A・B・Cが順番に少しずつ進んでいく様子を見てみてください。
プリエンプティブ(=強制交代あり)とは、実行中のタスクが「もう終わりにします」と言わなくても、OS が強制的にCPUを取り上げられる仕組みです。なぜこれが必要かというと、あるタスクが意図せず長く実行され続けると、他のタスクがいつまでも動けないからです。
強制交代の仕組みは、ハードウェアのタイマー(=一定時間ごとに合図を出す装置)を使います。タイムスライスの時間が来るとタイマーが OS に知らせ、OS が現在実行中のタスクを止めて次のタスクへ切り替えます。これをタイマー割り込み(=タイマーによる処理の中断)と呼びます。
対照的に、タスクが自分から「CPU を返す」まで動き続けるのがノンプリエンプティブ(強制交代なし)です。FCFS はその代表で、先頭のタスクが長時間かかると後続がずっと待ちます。ラウンドロビンはプリエンプティブだからこそ、全タスクへ均等に順番が回ります。
スケジューリングを評価するときに使う2つの時間を整理します。
・ターンアラウンドタイム:タスクが到着してから完了するまでの全体の経過時間のことです。「頼んでから受け取るまでの時間」に相当します。計算式は 完了時刻 − 到着時刻 です
・待ち時間:そのうち「CPUをもらえずに順番を待っていた時間」だけです。計算式は ターンアラウンドタイム − 実行時間 です
ラウンドロビンはプリエンプティブなので、1つのタスクが何度も「実行→待ち→実行→待ち」を繰り返します。このため待ち時間はラウンドロビン独自のガントチャートから計算する必要があります。たとえばタスクAが t=0 に到着し、t=0〜2 で実行→t=4 まで待ち→t=4〜5 で完了した場合、ターンアラウンドは 5 − 0 = 5、待ち時間は 5 − 3(実行時間)= 2 となります。