循環バッファの用途にはどのようなものがありますか?
循環バッファを使用する利点は何ですか?
二重リンクリストの代わりになりますか?
循環バッファの用途にはどのようなものがありますか?
循環バッファを使用する利点は何ですか?
二重リンクリストの代わりになりますか?
サイズが制限されたメモリ内ログに使用しました。たとえば、アプリケーションはユーザー要求の処理中にログエントリを書き込みます。例外が発生すると(処理が中断される)、現在メモリにあるログレコードが一緒にダンプされます。
循環バッファの利点は、古いエントリが自動的に上書きされるため、無限の量のメモリを必要としないことです。「課題」とは、ユースケースに適したサイズを見つける必要があるということです。上記の例では、例外に関する最も重要な情報を含むログレコードがすでに上書きされている場合、非常に残念です。
一部のシステム/アプリケーションには、バッファの現在のコンテンツをオンデマンドで抽出できるツールがあります。これは、バッファが自動的に抽出される場合(ある場合)だけではありません。
ETWとCLRのストレスログは、他の多くのシステムのカーネルや高性能トレース/ロギングの中でも、そのように実装されていると思います。
メモリ内のトレース/ロギングにこのようなバッファを使用するという概念は、実際にはかなり一般的です(これが唯一の使用法であるとは言えませんが、確かにそうではありません)。エラーが発生しない限り、関心があります。また、関連するメモとして、ハードディスクのスペースを節約します。
循環バッファは、組み込みシステムのシリアルデータストリームに適しています。マイクロコントローラーには、着信するシリアルバイトを処理するUARTがあることがよくあります。これらは順番に格納し、後で処理する必要があります(バイトは、処理できるよりも速い速度で着信することがよくあります)。
バッファは、必要なタイミングクリティカルな応答(バイトが入ったとき、マイクロ秒単位)をメッセージ全体に対する非タイミングクリティカルな応答(たとえば、入ったメッセージをミリ秒単位で表示する)に効果的に分割します。
1)バイトを受信すると、UARTは割り込みを生成し、ソフトウェアは受信したバイトをすばやく取得してバッファの最後に押し込みます。
2)バックグラウンドソフトウェアルーチンは、バッファにまだ何かが含まれているかどうかを定期的にチェックし、必要に応じて空にすることができます。
循環バッファサイズはコンパイル前に定義できるため、サイズは制限されます。これはスペース効率の向上に役立ち、データが失われ始める前に受信できるバイト数とのトレードオフでメモリの破損を排除する必要があります。
循環バッファは、値/アイテムのスライド/移動リストを順序付けられた方法で効率的に維持するための優れたメカニズムです。1つの例は、最後のN個のアイテムの移動平均を維持することです。ある値を計算する最後の100回の操作の平均コストを追跡したいとします。これを行うには、最も古いコストを削除し、最新のコストを追加する必要があります。
循環バッファがない場合、これを行うためのコストのかかるメカニズム(Cスタイル)は、100個の要素の配列を持つことです。新しいコストが計算されるたびに、99個の要素を下に移動して、新しい要素を最後の位置に配置することができます。これは明らかにコストがかかります。循環バッファのアイデアを使用すると、バッファの「終了」(位置0〜99)を追跡するだけです。これは、最も古い(または最も新しい…どちらを選択しても)コスト項目の位置を示します。(移動平均を更新するために)古い値を読み取った後、それを最新の値に置き換え、バッファー位置をインクリメントします(99の場合は、0に戻します。つまり、円形の部分です)。
それを二重にリンクされたリストと比較することは、実際には意味がありません。循環バッファは、二重にリンクされたリスト(または単一にリンクされたリスト)を使用して実装できます。しかし、それらを比較することは、いわばリンゴとオレンジを比較することに少し似ています。
私はこれが不正行為であることを知っていますが、ウィキペディアには非常に良い説明があります。
http://en.wikipedia.org/wiki/Circular_buffer
循環バッファ、循環バッファ、またはリングバッファは、エンドツーエンドで接続されているかのように、単一の固定サイズのバッファを使用するデータ構造です。この構造は、データストリームのバッファリングに適しています。
上書き循環バッファを使用する可能性のある例は、マルチメディアです。バッファが生産者/消費者問題で制限付きバッファとして使用される場合、消費者(サウンドカードなど)が一時的に追いつくことができない場合は、プロデューサー(オーディオジェネレータなど)が古いデータを上書きすることがおそらく望ましいでしょう。 。もう1つの例は、円形バッファーを使用して振動する弦や管楽器の音を効率的にシミュレートするデジタルウェーブガイドシンセシス法です。
二重リンクリストとの比較に関しては、実際にはリストを何に使用しているかに依存すると思います...循環バッファの実装はより複雑なようです。(もう一度)wikiページを参照してください。これは、実装、考慮事項などを説明し、サンプルコードも示しています。
ありがとう、ニール
マルチスレッドコードでリングバッファを使用しました。基本的に、すべてのスロットがいっぱいの場合、プロデューサーは待機する必要があります。消費者は、「満杯」のスロットでアイテムを処理するだけです。
これが私が始めたスレッドです。実装に関していくつかの良いアドバイスがあります。
ラウンドロビンスケジューリングを実装する簡単な方法として使用しました。基本的に、消費者が処理できる値を生成できるさまざまなオブジェクトがたくさんありました。私はすべてのプロデューサーをリングに閉じ込め、それぞれに順番に尋ねました。