4

データにアクセスするための基本的な手段としてファイル記述子を使用するライブラリを使用したいと考えています。パフォーマンス上の理由から、このライブラリの関数を使用する前にファイルをディスクにコミットする必要はありません。

その場で (大きな) データ BLOB を作成し、ライブラリを呼び出してサーバーに送信したいと考えています。現状では、ファイルをディスクに書き込んで開き、FD をライブラリに渡し、終了するのを待ってから、ディスク上のファイルを削除する必要があります。必要に応じて BLOB を再作成できるため (また、過度の仮想メモリ ページングが発生するほど BLOB は大きくないため)、BLOB をディスクに保存しても何も得られず、パフォーマンスが大幅に低下します。

メモリ マップされたエンティティとしてのみ存在するデータ ブロックに FD を割り当てることはできますか?

4

1 に答える 1

4

メモリを利用したファイルシステムをマウントできます:http ://lists.apple.com/archives/darwin-kernel/2004/Sep/msg00004.html

このメカニズムを使用すると、システムのメモリプレッシャーが増加し、メモリプレッシャーが十分に大きい場合はページアウトされる可能性があります。ユーザーが他のアプリケーションにメモリの最初の選択肢を持たせたい場合に備えて、これを構成オプションにすることは価値があるかもしれません。

もう1つのオプションは、POSIX共有メモリセグメントを使用することです。http ://opengroup.org/onlinepubs/007908799/xsh/shm_open.html (POSIX共有メモリセグメントを自分で使用したことはありません。正しく理解していれば、それらはまさにこの問題です。)

このshm_open()関数はメモリオブジェクトを作成し、ファイル記述子を返します。次に、mmap(2)そのファイル記述子を作成して作業を行い、ファイル記述子をライブラリに渡すことができます。

shm_unlink完了したら、オブジェクトを忘れないでください。POSIX共有メモリセグメント、メッセージキュー、およびセマフォ配列は、最後のプロセスが終了したときに自動的に消えることはありません。

于 2010-09-01T08:38:48.487 に答える