速度の異なる装置の間にバッファを置いて速度差を吸収する仕組み
バッファリング(buffering)とは、処理の速さが違う2つの装置の間にバッファ(=データを一時的にためておく記憶領域)を置き、速度の差を吸収する仕組みのことです。バッファは主に主記憶(メモリ)の一部を使います。
身近な例で考えると、洗い物を入れる「水切りカゴ」に似ています。お皿を洗う人(速い)が、拭いて棚にしまう人(遅い)の作業を毎回待っていたら効率が落ちます。そこで間にカゴを置き、洗ったお皿を一時的に積んでおけば、洗う人は止まらずに作業を続けられ、拭く人も自分のペースで取り出せます。このカゴがバッファです。
上のツールで▶ボタンを押すと、高速なCPUがバッファへデータを書き込み、低速なプリンタがそこから取り出していく流れが1ステップずつ見られます。バッファのマスが埋まったり空いたりする様子に注目してください。
もしバッファが無ければ、速い装置はデータを1つ渡すたびに遅い装置が受け取り終わるのを待たなければなりません。これを同期待ちといい、速い装置の能力が活かせず全体が遅くなります。バッファを間に挟むと、この待ちをなくせます。
仕組みは次の通りです。
・書き込み(生産):速い装置はデータをバッファに置いたら、相手の処理を待たずにすぐ次の仕事へ進む
・取り出し(消費):遅い装置は自分のペースでバッファからデータを取り出して処理する
・溜め置き:書き込みと取り出しの速さが一致しなくても、その差はバッファに溜まった量で吸収される
ただしバッファの容量には限りがあります。
・満杯(フル):速い装置が作りすぎてバッファがいっぱいになると、空きができるまで書き込みを待つ
・空(エンプティ):遅い装置が処理しすぎてバッファが空になると、データが入るまで取り出しを待つ
この「満杯なら書き込みを止め、空なら取り出しを止める」という調整によって、両者は壊れることなく協調して動けます。バッファの中身は先に入れたものから先に出す(先入れ先出し・FIFO)のが基本です。上のツールで「満杯で待機」「空で待機」と表示されるステップを見ると、待ちが発生する瞬間がよく分かります。
バッファリングは、速度差のある装置や処理をつなぐあらゆる場面で使われています。代表的な用途は次の通りです。
・CPUとプリンタの間:速いCPUが作った印刷データを出力バッファにためて、遅いプリンタが順に取り出す
・ネットワークとディスク:高速な通信で届くデータをバッファにためて、ディスクが追いついて書き込む
・動画・音楽のストリーミング:再生に先回りしてデータを読み込み、通信が一瞬遅れても再生が途切れないようにする
動画再生で「読み込み中…」と表示されるのは、まさにバッファにデータをためている時間です。十分にためてから再生を始めることで、後で通信が少し遅れても、ためておいた分で再生をなめらかに続けられます。これがバッファリングの恩恵を最も体感しやすい例です。
よく似た仕組みにスプーリングがあります。どちらも「いったんためる」点は共通ですが、性質が異なります。
| 項目 | バッファリング | スプーリング |
|---|---|---|
| 置き場所 | 主記憶(メモリ) | 補助記憶(ディスク) |
| 扱う量 | 少量(1対1の流れ) | 大量(複数ジョブ) |
| 主な目的 | 速度差の吸収 | 装置の共有・順次処理 |
| 代表例 | CPUとプリンタ間の出力バッファ | 印刷キュー |
ざっくり言うと、バッファリングはメモリを使って速度差を吸収する仕組み、スプーリングはディスクを使って複数の処理を順番待ちさせる仕組みです。目的と置き場所が違う、と覚えておくと混同しません。