---
title: "プリエンプティブスケジューリングとは？優先度とタスク状態の切り替わり【基本情報技術者試験】"
description: "プリエンプティブスケジューリングを、実行中タスクからCPUを取り上げて高優先度タスクへ切り替える方式として整理し、実行状態・実行可能状態・待ち状態、ディスパッチ、ノンプリエンプティブ方式との違いをFE試験向けに解説します。"
last_modified_at: "2026-07-16"
canonical_url: "https://stemtazoo.github.io/fe/preemptive-scheduling/"
section: "fe"
---

## まず結論

プリエンプティブスケジューリングとは、**実行中のタスクより優先度の高いタスクが実行可能になったとき、OSがCPUを取り上げて高優先度タスクへ切り替える方式**です。

基本情報技術者試験では、次のように判断します。

```text
低優先度タスクを実行中
↓
高優先度タスクが起動
↓
実行中タスクを中断
↓
中断されたタスクは実行可能状態へ
↓
高優先度タスクを実行
```

特に重要なのは、**中断されたタスクは待ち状態ではなく、実行可能状態へ戻る**という点です。

## 直感的な説明

病院の診察をイメージすると分かりやすいです。

通常の患者を診察中に、より緊急度の高い患者が来た場合、診察をいったん止めて、緊急患者を先に診ます。

```text
患者Bを診察中
↓
より緊急度の高い患者Aが来る
↓
Bはいったん待機列へ戻る
↓
Aを先に診察する
```

このときBは、検査結果待ちなどで動けないわけではありません。

単に診察の順番を譲っただけなので、CPUが空けばすぐ再開できます。

これが、**実行可能状態**です。

## 定義・仕組み

リアルタイムOSや一般的なOSでは、複数のタスクを切り替えながら実行します。

プリエンプティブ方式では、OSが実行中タスクのCPU使用権を強制的に取り上げることがあります。

代表的なタスク状態は次の3つです。

| 状態 | 意味 |
|---|---|
| 実行状態 | 現在CPUを使っている |
| 実行可能状態 | CPUが割り当てられれば実行できる |
| 待ち状態 | 入出力完了などを待ち、今すぐ実行できない |

状態の切り替わりは、次のように考えます。

```text
実行可能状態
↓ ディスパッチ
実行状態
↓ プリエンプション
実行可能状態

実行状態
↓ 入出力要求
待ち状態
↓ 入出力完了
実行可能状態
```

### 優先度が高いタスクが起動した場合

Aの優先度がBより高いとします。

```text
A > B
```

Bの実行中にAが実行可能になると、OSはBを中断し、Aを実行します。

```text
B：実行状態
A：実行可能状態になる
↓
B：実行可能状態へ
A：実行状態へ
```

### 優先度が低いタスクが起動した場合

Aの実行中に、低優先度のBが起動しても、Aの実行は続きます。

```text
A：実行中・高優先度
B：起動・低優先度
↓
A：実行継続
B：実行可能状態
```

このテーマは、基本情報技術者試験の「OS」「タスク管理」「リアルタイム処理」と関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、タスクの優先度と状態遷移を組み合わせて問われます。

判断手順は次のとおりです。

```text
1. 現在どのタスクが実行中か確認する
2. 新しく実行可能になったタスクの優先度を見る
3. 高優先度ならプリエンプションが起きる
4. 中断されたタスクは実行可能状態へ戻る
```

### よく出るパターン

| 状況 | OSの動作 |
|---|---|
| 高優先度Aを実行中に低優先度Bが起動 | Aを継続、Bは実行可能状態 |
| 低優先度Bを実行中に高優先度Aが起動 | Bを実行可能状態へ戻し、Aを実行 |
| 実行中タスクが入出力を要求 | 待ち状態へ移る |
| 入出力が完了 | 待ち状態から実行可能状態へ移る |

### ディスパッチとプリエンプション

| 用語 | 意味 |
|---|---|
| ディスパッチ | 実行可能なタスクへCPUを割り当てる |
| プリエンプション | 実行中タスクからCPUを取り上げる |

例えば、Bの実行中にAへ切り替える場合は、次の2つが続けて起きます。

```text
BからCPUを取り上げる
→ プリエンプション

AへCPUを割り当てる
→ ディスパッチ
```

## どんな場面で使う？

プリエンプティブスケジューリングは、重要な処理を優先して実行したい場面で使われます。

- 制御装置の異常停止処理
- センサー割込みへの応答
- 通信処理
- リアルタイム監視
- 複数アプリケーションの実行

例えば、通常の記録処理よりも、設備異常を検知した停止処理の優先度を高くしておけば、異常発生時にすぐCPUを切り替えられます。

```text
通常処理を実行中
↓
異常停止タスクが起動
↓
通常処理を中断
↓
停止処理を優先実行
```

## よくある誤解・混同

### 誤解1：中断されたタスクは待ち状態になる

中断の理由が高優先度タスクへの切替えなら、元のタスクは実行可能状態へ戻ります。

```text
CPUを譲っただけ
→ 実行可能状態

入出力完了を待つ
→ 待ち状態
```

### 誤解2：新しいタスクが起動すれば必ず切り替わる

新しく起動したタスクの優先度が低ければ、現在の高優先度タスクは実行を継続します。

### 誤解3：プリエンプションとディスパッチは同じ

プリエンプションはCPUを取り上げる処理、ディスパッチはCPUを割り当てる処理です。

### 誤解4：ノンプリエンプティブ方式でも同じ動作をする

ノンプリエンプティブ方式では、実行中タスクが自らCPUを手放すまで、他のタスクへ強制的に切り替えません。

| 方式 | 特徴 |
|---|---|
| プリエンプティブ | OSが強制的に切り替えられる |
| ノンプリエンプティブ | 実行中タスクがCPUを手放すまで待つ |

### 誤解5：優先度が高いほど必ず待ち時間がゼロになる

高優先度でも、さらに高い優先度のタスクが動いていたり、必要な資源を待っていたりすると、すぐ実行できない場合があります。

## 確認問題（基本情報技術者試験対策）

優先度に基づくプリエンプティブスケジューリングを行うOSがある。タスクXの優先度はタスクYより高い。Yの実行中にXが実行可能になったときの動作として、最も適切なものはどれか。

- ア. Yを待ち状態にしてXを実行する
- イ. Yを実行可能状態にしてXを実行する
- ウ. Xを待ち状態にしてYを実行し続ける
- エ. XとYを同時に実行状態にする

<details markdown="1">
<summary>▶ クリックして答えと解説を見る（ここを開く）</summary>

**正解：イ**

Xの方が高優先度なので、OSはYからCPUを取り上げてXへ切り替えます。

Yは入出力待ちではなく、CPUが空けば再開できるため、待ち状態ではなく実行可能状態へ戻ります。

</details>

## まとめ（試験直前用）

- プリエンプティブ方式は、OSが実行中タスクからCPUを取り上げられる方式
- 高優先度タスクが起動すると、低優先度タスクを中断して切り替える
- 中断されたタスクは、通常、待ち状態ではなく実行可能状態へ戻る
- 実行可能状態は、CPUが割り当てられれば実行できる状態
- 待ち状態は、入出力完了などを待っている状態
- プリエンプションはCPUを取り上げる処理
- ディスパッチは実行可能タスクへCPUを割り当てる処理
- ノンプリエンプティブ方式では、実行中タスクを強制的に切り替えない
