3

C で循環バッファーを実装しようとしていますが、ウィキペディアでこの例に出くわしました (2014 年 7 月に削除されました)。バッファの最後から最初にラップアラウンドする読み取りが自動的に処理されるため、バッファから読み取る人にとって本当に素晴らしいインターフェイスを提供するように見えます。したがって、すべての読み取りは連続しています。

ただし、メモリマッピングや仮想メモリの経験があまりなく、それが何をしているのかを完全に理解しているかどうかわからないため、すぐに使用できるかどうかは少しわかりません。

私が理解していると思うのは、共有メモリファイルをバッファのサイズでメモリに2回マッピングしていることです。次に、データがバッファに書き込まれるたびに、メモリ内の 2 つの場所に一度に表示されます。これにより、すべての読み取りを連続させることができます。

本当に素晴らしいのは、POSIX メモリ マッピングの経験が豊富な人がコードをざっと見て、使用されている基本的なメカニズムが本当に効率的かどうかを教えてくれることです。たとえば、共有メモリに使用される /dev/shm 内のファイルは常に RAM に保持されるか、ある時点でハード ドライブに書き込まれる可能性がある (パフォーマンス ヒット) と考えるのは正しいでしょうか? 注意すべき落とし穴はありますか?

現状では、おそらく現在のプロジェクトにはもっと簡単な方法を使用するつもりですが、将来のためにツールボックスに入れておくために、これを理解しておくとよいでしょう。

お時間をいただきありがとうございます。

4

1 に答える 1

4

mmap最初の匿名は、両方のマッピングを保持するために未使用のメモリ内のアドレス領域を選択するためだけに行われると思います。
「/dev/ shm」は通常、すべてのデータをスワップ/メモリに保存するファイルシステム「tmpfs」でマウントされます。したがって、実際にはハードドライブへの書き込みが発生する可能性がありますが、malloc-edメモリでも同じ可能性があります。

私の「/etc/ fstab」に「glibc2.2以降では、POSIX共有メモリ(shm_open、shm_unlink)の/ dev/shmにtmpfsがマウントされることが想定されています」と書かれています。一部のシステムはそれに従わない場合があります。ただし、メモリマップトファイルがスワップのように機能することを願っていますが、データをできるだけ早くディスクに同期しようとします。

状態としてman mkstemp-glibc2.06以前は、パーミッション0666でファイルを作成します。これは、誰かがとの間でファイルをキャッチすると、セキュリティホールにつながる可能性がmkstempありunlinkます。

于 2010-05-27T18:32:50.320 に答える