コンピュータを開いてパスワードを入力し始めたら、入力中の文字に大きなラグがあったという経験はありませんか? この遅延は、コンピュータ プロセッサが起動し、キーボード内のミニ プロセッサからデータを取得する必要があることに気づいたときに発生します。 しかし、キーボードのメモリにわずかなスペースしかない場合、この情報はどのように保存されるのでしょうか。
ここで、サーキュラー バッファが登場します。 キューに馴染みのない方は、ラインとしてご存じかもしれません。 (このキューは、先入れ先出し (FIFO) 構造です。 つまり、最初に列に入った人が、最初に出て行くということです。 では、円形キューは何が違うのでしょうか。
円形バッファは、固定サイズの配列にデータを格納します。 そのため、サイズが設定され、バッファが一杯になると、さらにデータが追加された場合、バッファ内の最も古いアイテムが押し出されます。 構造体の前面と背面の 2 つのポインターを格納することにより、配列を動的に操作する必要はありません。
しかし、バッファが一杯になって何か新しいものを追加する必要がある場合、背面ポインターが指すリスト項目を新しい項目に設定し、背面ポインターを 1 つ増分するだけでよいのです。
メモリ割り当てのこのテクニックは、リアルタイムで多くのデータを扱っている場合にメリットがあります。 より多くのデータが構造体に追加されると、古いデータは削除されるため、データをシフトする必要はありません。 前述したように、ポインターは位置を移動するだけです。
さて、キーボードとパスワード入力に話を戻しましょう。 キーストロークはすべて円形のバッファに保持されます。 そのため、速く入力すると、キーストロークから受け取った入力の一部が失われる可能性があります。
循環バッファを想像しやすいように、自動レストランを構築してみましょう。 このレストランには、一度に一人の客が食事(データ)を受け取ることができるピックアップウィンドウ(バッファの奥)が1つある。 窓の奥には、8食分の食事が入る回転式の円形テーブルがあります(バッファ)。 また、テーブルの前(またはバッファの前)を指すライトもあります。
シェフは食事を作り終えると、ライトで照らされた場所の手前1カ所に食事を置く。 そして、ライトは新しく置かれた料理を照らします。 バッファがいっぱいになり、コンロから食事が出るようになると、窓際の食事はゴミ箱に捨てられる。
使用例
ある講師が、ユーザーが入力した動きのフレームを保持するために円形のバッファを使用している拡張現実技術会社について教えてくれました。 彼らはユーザーの手や体の動きを記録し、それをリアルタイムでディスプレイにストリーミングしていました。
ストリーミングの映画やテレビ番組を数分巻き戻したとき、前のフレームが円形のバッファに保存されているので、すぐにアクセスできます。 バッファに格納されているよりも多くのフレームを巻き戻すと、検索しているフレームを再ロードするのに時間がかかります。
結論として、すでに観察または使用されているストリーミング データにすばやくアクセスする必要がある場合、循環バッファは良いソリューションかもしれません!
このような場合には、バッファに格納されているフレームを検索して、そのフレームにアクセスします。