FE EXAM

バッファリング(速度差の吸収)

速度の異なる装置の間にバッファを置いて速度差を吸収する仕組み

INTERACTIVE VISUALIZATION
高速側(生産)
バッファ
低速側(消費)
待ち
フェーズ
IDLE
生産(累計)
0
バッファ内
0 / 4
消費(累計)
0
シナリオ
ステップ1 / 8
バッファの容量
4溜められる最大数
STEP 1/8速度差のある2つの装置CPU(高速)とプリンタ(低速)は処理の速さが違います。CPUが次々とデータを作るのに対し、プリンタは1つ処理するのに時間がかかります。このまま直接つなぐと、速い側が遅い側を待ち続けてしまいます。
CPU高速(作る側)バッファ(メモリ)先入れ先出し(出口は右)プリンタ低速(処理する側)直接つなぐと速い側が待たされる
解説

📌
バッファリングとは

速い装置と遅い装置の間に「ためる場所」速いバッファ遅い速度差をならして両者がスムーズに動く

バッファリング(buffering)とは、処理の速さが違う2つの装置の間にバッファ(=データを一時的にためておく記憶領域)を置き、速度の差を吸収する仕組みのことです。バッファは主に主記憶(メモリ)の一部を使います。

身近な例で考えると、洗い物を入れる「水切りカゴ」に似ています。お皿を洗う人(速い)が、拭いて棚にしまう人(遅い)の作業を毎回待っていたら効率が落ちます。そこで間にカゴを置き、洗ったお皿を一時的に積んでおけば、洗う人は止まらずに作業を続けられ、拭く人も自分のペースで取り出せます。このカゴがバッファです。

上のツールで▶ボタンを押すと、高速なCPUがバッファへデータを書き込み、低速なプリンタがそこから取り出していく流れが1ステップずつ見られます。バッファのマスが埋まったり空いたりする様子に注目してください。

📌
速度差吸収の仕組み

もしバッファが無ければ、速い装置はデータを1つ渡すたびに遅い装置が受け取り終わるのを待たなければなりません。これを同期待ちといい、速い装置の能力が活かせず全体が遅くなります。バッファを間に挟むと、この待ちをなくせます。

仕組みは次の通りです。
書き込み(生産):速い装置はデータをバッファに置いたら、相手の処理を待たずにすぐ次の仕事へ進む
取り出し(消費):遅い装置は自分のペースでバッファからデータを取り出して処理する
溜め置き:書き込みと取り出しの速さが一致しなくても、その差はバッファに溜まった量で吸収される

ただしバッファの容量には限りがあります。
満杯(フル):速い装置が作りすぎてバッファがいっぱいになると、空きができるまで書き込みを待つ
空(エンプティ):遅い装置が処理しすぎてバッファが空になると、データが入るまで取り出しを待つ

この「満杯なら書き込みを止め、空なら取り出しを止める」という調整によって、両者は壊れることなく協調して動けます。バッファの中身は先に入れたものから先に出す(先入れ先出し・FIFO)のが基本です。上のツールで「満杯で待機」「空で待機」と表示されるステップを見ると、待ちが発生する瞬間がよく分かります。

📌
用途

バッファリングは、速度差のある装置や処理をつなぐあらゆる場面で使われています。代表的な用途は次の通りです。
CPUとプリンタの間:速いCPUが作った印刷データを出力バッファにためて、遅いプリンタが順に取り出す
ネットワークとディスク:高速な通信で届くデータをバッファにためて、ディスクが追いついて書き込む
動画・音楽のストリーミング:再生に先回りしてデータを読み込み、通信が一瞬遅れても再生が途切れないようにする

動画再生で「読み込み中…」と表示されるのは、まさにバッファにデータをためている時間です。十分にためてから再生を始めることで、後で通信が少し遅れても、ためておいた分で再生をなめらかに続けられます。これがバッファリングの恩恵を最も体感しやすい例です。

よく似た仕組みにスプーリングがあります。どちらも「いったんためる」点は共通ですが、性質が異なります。

項目バッファリングスプーリング
置き場所主記憶(メモリ)補助記憶(ディスク)
扱う量少量(1対1の流れ)大量(複数ジョブ)
主な目的速度差の吸収装置の共有・順次処理
代表例CPUとプリンタ間の出力バッファ印刷キュー

ざっくり言うと、バッファリングはメモリを使って速度差を吸収する仕組み、スプーリングはディスクを使って複数の処理を順番待ちさせる仕組みです。目的と置き場所が違う、と覚えておくと混同しません。

関連コンテンツ