---
title: "CPUスケジューリングとは？優先度とI/O待ちから遊休時間を求める方法【基本情報技術者試験】"
description: "CPUスケジューリングを、優先度、実行可能状態、I/O待ち、CPUの遊休時間という観点から整理し、タイムチャート問題の解き方をわかりやすく解説します。"
last_modified_at: "2026-07-13"
canonical_url: "https://stemtazoo.github.io/fe/cpu-scheduling-idle-time/"
section: "fe"
---

## まず結論

CPUスケジューリングとは、**複数のタスクのうち、次にどのタスクへCPUを割り当てるかを決める仕組み**です。

基本情報技術者試験では、次の順で考えると整理しやすくなります。

```text
1. CPUを使えるタスクを確認する
2. その中から優先度が高いタスクを選ぶ
3. I/O待ちのタスクはCPUを使えない
4. CPUを使えるタスクが1つもなければ遊休時間
```

特に大切なのは、**優先度が高くても、I/O待ち中ならCPUは使えない**という点です。

## 直感的な説明

CPUを、1人しかいない作業者だと考えてみます。

複数の仕事が届いていても、作業者が同時に処理できるのは1件だけです。

一方、I/O装置は別の担当者のようなものです。

```text
CPU処理 → CPUが担当する
I/O処理 → 入出力装置が担当する
```

あるタスクがI/O処理をしている間、CPUは別の実行可能なタスクを処理できます。

## 定義・仕組み

タスクは、処理の進行に応じて状態が変わります。

| 状態 | 意味 |
|---|---|
| 実行状態 | 現在CPUを使っている |
| 実行可能状態 | CPUが空けば実行できる |
| 待ち状態 | I/O完了などを待っている |

CPUは、**実行可能状態のタスク**から次に実行するものを選びます。

優先度方式では、実行可能なタスクの中から、優先度が最も高いものを実行します。

```text
優先度が高い
＋
実行可能状態
→ CPUを使える
```

優先度が高くても、I/O待ちなら候補にはなりません。

## 科目Aでどう出る？

科目Aでは、CPU処理とI/O処理が交互に並ぶタスクをタイムチャートにして、CPUの遊休時間などを求めます。

たとえば、3つのタスクが次の処理を行うとします。

| 優先度 | 処理順序 |
|---|---|
| 高 | CPU 3 → I/O 5 → CPU 2 |
| 中 | CPU 2 → I/O 6 → CPU 2 |
| 低 | CPU 1 → I/O 5 → CPU 1 |

CPUの処理順は次のようになります。

```text
0〜3   高のCPU処理
3〜5   中のCPU処理
5〜6   低のCPU処理
6〜8   全タスクがI/O待ち → CPU遊休
8〜10  高のCPU処理
10〜11 全タスクがI/O待ち → CPU遊休
11〜13 中のCPU処理
13〜14 低のCPU処理
```

したがって、CPUの遊休時間は、

```text
6〜8   2ミリ秒
10〜11 1ミリ秒
合計   3ミリ秒
```

となります。

## タイムチャートの書き方

1. 最初に実行可能なタスクを確認する
2. その中から最も優先度が高いものを実行する
3. I/Oに入ったタスクを待ち状態にする
4. 残りの実行可能タスクを探す
5. 実行可能タスクがなければ遊休時間として記録する

この順番で追えば、複雑な問題でも整理しやすくなります。

## よくある誤解・混同

### 誤解1：優先度が高いタスクは常にCPUを使う

優先度が高くても、I/O待ち中ならCPUは使えません。

### 誤解2：I/O中もCPUを使っている

I/O処理は入出力装置が担当します。その間、CPUは別のタスクを実行できます。

### 誤解3：CPU時間とI/O時間を全部足せばよい

CPU処理とI/O処理は並行して進むため、単純な合計では求められません。

### 誤解4：空白時間をすべて遊休時間と考える

遊休時間は、**CPUを使えるタスクが1つもない時間**です。各タスクが実行可能か待ち状態かを確認します。

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

- CPUは、実行可能なタスクの中から次に実行するものを選ぶ
- 優先度方式では、実行可能な中で最も優先度が高いタスクを選ぶ
- I/O待ちのタスクはCPUを使えない
- 全タスクがI/O待ちの時間がCPUの遊休時間
- タイムチャートを書いて、CPU処理とI/O処理を分けて追う
