---
title: "バッファサイズの求め方とは？送信速度と受信速度の差を考える【基本情報技術者試験】"
description: "送信速度と受信速度の差からバッファにたまる量を求め、オーバーフローしないための容量条件を科目A向けに整理します。S−RとR−S、不等号の向きを切り分ける判断軸も解説します。"
last_modified_at: "2026-07-21"
canonical_url: "https://stemtazoo.github.io/fe/buffer-size-transfer-rate/"
section: "fe"
---

## まず結論

送信側の方が受信側より速いとき、バッファにたまる量は次の式で求めます。

```text
バッファにたまる量
=（入力速度 − 出力速度）× 時間
```

送信速度を `S`、受信速度を `R`、連続送信時間を `T`、バッファサイズを `L` とすると、オーバーフローしない条件は次のとおりです。

```text
L ≧ (S − R) × T
```

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

- 1秒あたりに増える量は `S − R`
- T秒間なら `(S − R) × T`
- 容量は必要量以上なので `L ≧ 必要量`

## 直感的な説明

バッファは、送信側と受信側の速度差を一時的に吸収する「待合場所」です。

例えば、送信側が1秒に100バイトを送り、受信側が1秒に80バイトしか処理できないとします。

```text
入る量：100バイト/秒
出る量： 80バイト/秒
差　　： 20バイト/秒
```

この20バイトが毎秒バッファへ残ります。

10秒間続けば、バッファには次の量がたまります。

```text
20 × 10 = 200バイト
```

したがって、バッファサイズは少なくとも200バイト必要です。

## 定義・仕組み

バッファとは、処理速度の異なる装置やタスクの間で、データを一時的に保存する領域です。

この問題では、送信タスクがバッファへデータを入れ、受信タスクがバッファからデータを取り出します。

```text
送信タスク
   ↓ S
バッファ
   ↓ R
受信タスク
```

### 1秒あたりにたまる量

1秒でバッファへ入る量は `S`、1秒で出ていく量は `R` です。

したがって、1秒あたりの増加量は次の式になります。

```text
S − R
```

考える順番は、次のとおりです。

```text
入ってくる量 − 出ていく量
```

### T秒間にたまる量

1秒あたりに `S − R` だけ増えるため、T秒間では次の量がたまります。

```text
(S − R) × T
```

これは、送信量全体ではありません。

送信中も受信側は処理を続けているため、バッファへ残るのは両者の差分です。

```text
S × T − R × T
= (S − R) × T
```

### オーバーフローしない条件

バッファがあふれないためには、バッファサイズ `L` が最大滞留量以上である必要があります。

```text
L ≧ (S − R) × T
```

容量がちょうど最大滞留量と同じでも、あふれません。そのため、`>` ではなく `≧` を使います。

## 科目Aでどう出る？

科目Aでは、送信速度・受信速度・時間から、オーバーフローしないバッファサイズの条件を選ぶ問題として出やすいです。

次の順に考えると安全です。

```text
1. どちらがバッファへ入れる側か
2. どちらがバッファから出す側か
3. 1秒あたりの差はいくつか
4. 何秒続くか
5. 容量は必要量以上か
```

| 確認すること | 判断 |
|---|---|
| 入る速度 | 送信速度 `S` |
| 出る速度 | 受信速度 `R` |
| 1秒あたりの滞留量 | `S − R` |
| T秒間の滞留量 | `(S − R) × T` |
| オーバーフローしない条件 | `L ≧ (S − R) × T` |

### 符号を確認する

問題文で `S > R` と示されているなら、`S − R` は正の値です。

一方、`R − S` は負になります。

```text
S > R
↓
S − R > 0
R − S < 0
```

バッファにたまる量が負になるのは不自然なので、式の順番を見直します。

### 不等号を確認する

オーバーフローを防ぐには、容量が必要量以上でなければなりません。

```text
容量 ≧ 必要量
```

したがって、`L < 必要量` となる選択肢は切れます。

### 数字を入れて確かめる

式だけで迷う場合は、簡単な数字を入れてみます。

```text
S = 100バイト/秒
R = 80バイト/秒
T = 10秒
```

すると、

```text
(100 − 80) × 10
= 200バイト
```

となります。

バッファサイズは200バイト以上必要です。

関連して、システム全体の単位時間あたりの処理量を確認したい場合は、[スループットとは？単位時間あたりの処理量とスプーリングの関係](https://stemtazoo.github.io/fe/throughput-spooling/)も参考になります。

## 科目Bでどう使う？

科目Bでは、プログラム中でバッファへ追加される量と、取り出される量を追跡する場面で同じ考え方を使います。

ただし、必ず一定速度とは限りません。

各区間ごとに、次のように整理します。

```text
現在のバッファ量
+ 入ってきた量
− 取り出された量
= 次のバッファ量
```

処理が繰り返される場合は、各時点でバッファ量が容量を超えないか確認します。

```text
バッファ量 > 容量
→ オーバーフロー
```

## よくある誤解・混同

### `R − S` と考える

バッファへ入る量から、出ていく量を引きます。

```text
入る量 − 出る量
= S − R
```

問題文で送信側の方が速いなら、`R − S` では負の値になってしまいます。

### 送信量全体 `S × T` が必要容量になる

受信側も同時にデータを取り出しています。

そのため、必要容量は送信量全体ではなく、送信量と受信量の差です。

```text
S × T − R × T
= (S − R) × T
```

### 容量は必要量より小さくてもよい

必要量より小さいバッファでは、途中であふれます。

```text
L < 最大滞留量
→ オーバーフローする
```

必要なのは、次の条件です。

```text
L ≧ 最大滞留量
```

### 送信速度が受信速度以下でも同じ式で容量が増え続ける

`S ≤ R` なら、受信側が送信側以上の速度で処理できます。

一定速度で同時に動作するという前提では、バッファ量は増え続けません。

```text
S > R
→ バッファにたまり続ける

S ≤ R
→ バッファにたまり続けない
```

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

送信タスクが1秒当たり120バイトをバッファへ送り、受信タスクが1秒当たり90バイトを取り出す。これを8秒間連続して行うとき、オーバーフローを防ぐために必要な最小バッファサイズはどれか。

- ア. 30バイト
- イ. 90バイト
- ウ. 240バイト
- エ. 960バイト

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

**正解：ウ**

1秒あたりにたまる量は、

```text
120 − 90 = 30バイト
```

8秒間では、

```text
30 × 8 = 240バイト
```

したがって、必要な最小バッファサイズは240バイトです。

</details>

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

- バッファは、送信側と受信側の速度差を一時的に吸収する
- 1秒あたりにたまる量は「入る速度 − 出る速度」
- 送信速度をS、受信速度をRとすると、滞留量は `S − R`
- T秒間の最大滞留量は `(S − R) × T`
- オーバーフローしない条件は `L ≧ (S − R) × T`
- 送信量全体ではなく、送信量と受信量の差を考える
- 迷ったら、簡単な数字を入れて符号と不等号を確認する
