FE EXAM

優先度方式(プライオリティスケジューリング)

優先度の高いタスクから先にCPUを割り当てるスケジューリング方式。

INTERACTIVE VISUALIZATION
A
B
C
D
フェーズ
idle
現在時刻
0
優先度の決まり
数値が小さいほど高い
シナリオ
ステップ1 / 13
STEP 1/13開始前 — 優先度の高い順に並ぶ各タスクには優先度が付いています。ここでは数値が小さいほど優先度が高いものとし、レディーキュー(=CPUを待つ順番待ちの列)を優先度の高い順に並べています。先頭から実行していきます。
レディーキュー(優先度の高い順=左から)
B
優先度 1
処理 2
A
優先度 2
処理 3
C
優先度 3
処理 2
D
優先度 4
処理 4
ガントチャート(横軸=時間)
01234567891011時間 →t=0
解説

📌
優先度方式とは

優先度 高B優1A優2C優3D優4左(高優先度)から実行する

優先度方式とは、各タスク(=CPUに処理してほしい仕事)に優先度という順位を付けておき、優先度の高いものから先にCPUを割り当てるスケジューリング方式のことです。

身近な例で考えると、病院の救急外来に似ています。受付に来た順ではなく、症状の重い人(=優先度の高い人)から先に診察する。緊急性の高い仕事を後回しにしないための考え方です。

上のツールで▶ボタンを押すと、レディーキュー(=順番待ちの列)から最も優先度の高いタスクが選ばれて実行され、優先度の高い順にガントチャート(=横軸が時間の実行記録)が埋まっていく様子を確認できます。低い優先度のタスクほど後回しになる点に注目してください。

🏷️
優先度の決め方

静的優先度は固定動的状況で変える動的の代表=エイジング

優先度は何をもとに決めるのでしょうか。よく使われる基準は次のとおりです。
重要度:システムにとって重要な処理(OSの中核処理など)を高くする
締切(デッドライン):早く終わらせる必要がある処理を高くする
処理時間:短く済むタスクを先に片付ける、といった考え方もある

優先度の付け方には大きく2種類あります。
静的優先度:あらかじめ決めた優先度を最後まで変えない方式。単純で分かりやすい
動的優先度:実行の状況に応じて優先度を変える方式。代表例がエイジング(=待ち時間が長いタスクの優先度を少しずつ上げる仕組み)

エイジングを使うと、最初は優先度が低くても「長く待たされたタスク」はだんだん優先度が上がり、やがて必ず実行されるようになります。次のカードで説明する飢餓状態を防ぐための工夫です。

⚠️
飢餓状態のリスク

高優先 続々高優先 続々低優先 Dずっと順番が来ない

優先度方式の弱点が飢餓状態(starvation)です。これは、低優先度のタスクが、次々にやってくる高優先度タスクに割り込まれ続け、いつまでも実行されない状態のことです。

身近な例で考えると、行列に横入りされ続ける状況に似ています。自分の前に「急いでいる人」が次から次へと割り込んでくると、自分の順番は永遠に回ってきません。優先度方式では、高優先度のタスクが絶え間なく到着すると、低優先度のタスクがまさにこの状態になります。

対策が前のカードで触れたエイジングです。待っている時間が長くなるほど優先度を少しずつ上げていけば、最初は低優先度でもいつかは高優先度に追いつき、必ず実行されるようになります。上のツールで、低優先度のDが他のタスクをすべて待ってから最後に実行される様子を確認してみてください。

📌
なぜ優先度方式が必要か — 他の方式との違い

方式選ぶ基準向いている場面弱点
FCFS到着時刻バッチ処理コンボイ効果(先頭が長いと全員が待つ)
ラウンドロビン順番(公平)対話型・Web重要な処理も後回しになることがある
優先度方式重要度・緊急度リアルタイム・OS中核低優先度が飢餓に陥りやすい

FCFS とラウンドロビンは「公平さ」に着目した方式で、どのタスクも等しく扱います。しかし現実には、すべての仕事が同じ重要度であることはほとんどありません。たとえば OS の中核処理(キーボード入力の受付など)は、一般のアプリより素早く終わらせる必要があります。

優先度方式が解決するのはまさにこの点です。重要な処理には高い優先度を付けて先に実行させることで、「締め切りまでに終わらせなければならない仕事」や「遅れると致命的な処理」を確実に素早く終わらせることができます。一方でトレードオフ(=一方を良くすると別の何かが悪くなる)として、低優先度のタスクが待たされやすいという弱点があります。上のツールで各シナリオを切り替え、優先度の順に実行されていくことを確認してみてください。

📌
プリエンプティブ優先度方式 — 途中でも割り込める

ノンプリエンプティブ(中断しない)AB(高)Aが終わるまでBは待つプリエンプティブ(途中で割り込める)AB(高)A再開Bが来たらAを中断してBへ

優先度方式にもノンプリエンプティブ(非横取り)プリエンプティブ(横取りあり)の2種類があります。
ノンプリエンプティブ優先度方式:実行が始まったタスクは途中で止めない。次の選択のときだけ優先度を見る。実装が簡単だが、高優先度の新しいタスクが来ても今のタスクが終わるまで待つ
プリエンプティブ優先度方式:実行中でも、より優先度の高いタスクが到着したら即座に中断してそちらに切り替える。緊急性の高い処理に向くが、コンテキストスイッチ(=タスクを切り替えるための準備作業)のコストが増える

身近な例で考えると、ノンプリエンプティブは「今の電話が終わるまで緊急連絡を受けない」、プリエンプティブは「緊急電話が来たら今の電話を保留にして切り替える」ようなイメージです。現代の OS はほとんどプリエンプティブを採用しており、1つのアプリが応答しなくなっても他のアプリが動き続けられるのはこの仕組みのおかげです。

練習問題

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

Q1.優先度方式(プライオリティスケジューリング)の説明として最も適切なものはどれか。
A.到着した順にタスクを最後まで実行する
B.各タスクに一定時間ずつ順番に割り当てる
C.優先度の高いタスクから先にCPUを割り当てる
D.ランダムに選んだタスクから実行する
Q2.優先度の決め方に関する説明として誤っているものはどれか。
A.優先度は重要度・締切・処理時間などをもとに決められる
B.優先度を固定する方式(静的)と、状況で変える方式(動的)がある
C.エイジングとは、待ち時間が長いタスクの優先度を上げる仕組みである
D.優先度はいったん決めたら絶対に変更できない
Q3.優先度方式で起こりうる「飢餓状態(starvation)」の説明として正しいものはどれか。
A.CPUが過熱して停止する状態
B.低優先度のタスクが高優先度タスクに割り込まれ続け、いつまでも実行されない状態
C.メモリが不足してタスクが置けない状態
D.すべてのタスクが同時に終了する状態

関連コンテンツ