優先度別に複数の待ち行列を用意してタスクをスケジューリングする方式。
多重待ち行列(multilevel queue)方式とは、優先度ごとに複数の待ち行列(キュー)を用意し、それぞれを別のスケジューリング方式で管理する方法のことです。待ち行列とは、CPUを使う順番を待つタスクが並ぶ列のことです。
身近な例で考えると、病院の受付に似ています。救急の患者を通す窓口、一般診察の窓口、健康診断の窓口を分けておけば、急ぐ人を後回しにせず、急がない人にじゃまされずに対応できます。タスクも性質ごとに列を分けるわけです。
上のツールで▶ボタンを押すと、届いたタスクを高・中・低の3つのキューに振り分け、上のキューから順に処理していく流れを確認できます。
多重待ち行列の動きは、上のキューを最優先で処理し、空になったら下のキューに移るという単純なルールです。
ポイントは次のとおりです。
・キューごとに方式を変えられる:上位キューはラウンドロビン(=順番に少しずつ時間を分け合う方式)、下位キューはFCFS(=先着順)など、性質に合った方式を使える
・キューの選び方:タスクの種類(対話的処理かバッチ処理か)でどのキューに入れるかを決める
・上位が優先:下位キューを処理中でも、上位キューに新しいタスクが来ればそちらが優先される
発展形として多重フィードバックキューがあります。これは、長く待っているタスクを上位キューへ引き上げたり、CPUを使いすぎたタスクを下位キューへ落としたりして、タスクがキューの間を移動する仕組みです。これにより、後回しになり続けるタスクが出にくくなります。
多重待ち行列方式は、性質の異なるタスクを効率よく扱いたいときに使われます。とくに代表的なのが、反応の速さが求められる処理と、急がない処理が混在する場面です。
具体的な使い分けの例は次のとおりです。
・対話的処理:キー入力や画面更新など、利用者がすぐ反応を期待する処理 → 高優先度キュー
・一般処理:ファイル保存や印刷など、ふつうの業務処理 → 中優先度キュー
・バッチ処理:夜間集計やバックアップなど、まとめて行う急がない処理 → 低優先度キュー
こうして列を分けておくと、利用者の操作に対する反応が後回しにされず、画面が「カクつく」のを防げます。一方で重いバックアップ処理は、CPUが空いた合間に少しずつ進めればよいわけです。上のツールで、高優先度の対話的処理から先に片付く様子を見てみてください。