バッファ

読み:バッファ
外語:buffer , 缓冲 大陸簡体 , 緩衝 台灣正體
品詞:さ変名詞

緩衝領域、クッション領域。

プログラムで処理を行なう際、データを一時的に格納するためのメモリ領域をいう。

例えば、実際の処理の前に、処理に都合の良いようにデータを加工して保管して置く場所として用いたり、他の処理とデータのやり取りをする際、お互いのデータを格納するための領域として用いたりする。

確保場所

バッファをどこに確保するかは、様々な手法がある。

  • 決まったアドレスに確保する方式
  • スタックに確保する方式
  • ヒープに確保する方式

アセンブリ言語などでは決まったアドレスにサイズを確保して扱う簡易な方法がよく使われる。CC++などでもstaticグローバル変数は同様の扱いとなる実装が多いようである。

CやC++では、関数内でautoで確保した変数はスタックに領域が確保される。CのmallocやC++のnewを用いて確保したものはヒープに領域が確保されている。

管理方法

バッファの管理方法には、主に次のような方法が使われる。

  • 排他制御が無く一つの処理で占有するもの
  • リングバッファ (複数個所からの読み書きをこなす)
  • FIFO
  • LIFO (スタック)

データ通信の場合は、送信バッファや受信バッファなどとしてバッファを用い、この管理にはよくリングバッファが用いられる。

あふれ

リングバッファを用いない処理の場合、想定以上のサイズのデータを受信した場合にはバッファが溢れることがある。このとき、プログラムの格納されたメモリ領域があふれた不正なデータで上書きされてしまうことがある。

これはバッファオーバーフローと呼ばれるバッファ管理プログラムのバグであるが、ありがちなバグであり、古くからプログラマを苦しめた。

これを悪用すると通信のデータ中に破壊プログラムなどを混入させ、それを受信した端末のデータ等を故意に破壊する事も可能となる。