ファイルアクセスに mmap を使用するのはいつですか? 質問する

ファイルアクセスに mmap を使用するのはいつですか? 質問する

POSIX 環境では、ファイルにアクセスする方法が少なくとも 2 つあります。標準のシステム コールopen()、、、および類似のものがありますが、 を使用してファイルを仮想メモリにマップするオプションもあります。read()write()mmap()

どちらか一方を使用する方がよいのはどのような場合ですか? 2 つのインターフェースを含める価値があるそれぞれのメリットは何ですか?

ベストアンサー1

mmapこれは、複数のプロセスが同じファイルから読み取り専用でデータにアクセスする場合に最適です。これは、私が作成する種類のサーバー システムでは一般的です。mmapすべてのプロセスが同じ物理メモリ ページを共有できるため、大量のメモリを節約できます。

mmapまた、オペレーティングシステムはページング操作を最適化することもできます。たとえば、で作成されたバッファにファイルAを読み込むプログラムと、1MB のファイルをメモリに読み込むプログラム B という 2 つのプログラムを考えてみましょう。オペレーティングシステムがのメモリの一部をスワップアウトする必要がある場合、メモリを再利用する前にバッファの内容をスワップに書き込む必要があります。 の場合、変更されていないのページは、OS が元のファイルから復元する方法を知っているため、すぐに再利用できます。(OS は、最初に書き込み可能な のページを読み取り専用としてマークし、変更されたページをキャッチすることで、変更されていないページを検出できます。1MBmallocmmapsABmmapmmapmmapセグメント障害、 に似ているコピーオンライト戦略)。

mmapにも役立ちますプロセス間通信mmap通信する必要があるプロセスでファイルを読み取り/書き込みとして設定し、領域内で同期プリミティブを使用できますmmap'd(これがMAP_HASSEMAPHOREフラグの目的です)。

厄介なのmmapは、32 ビット マシンで非常に大きなファイルを操作する必要がある場合です。これは、mmapプロセスのアドレス空間で、マップされるファイルの全範囲に適合するのに十分な大きさの連続したアドレス ブロックを見つける必要があるためです。アドレス空間が断片化されると、2 GB の空きアドレス空間があっても、その個々の範囲が 1 GB のファイル マッピングに適合しないなど、問題が発生する可能性があります。この場合、ファイルを、収まるようにしたいよりも小さなチャンクにマップする必要がある可能性があります。

を read / write の代わりとして使用する場合のもう 1 つの潜在的な問題mmapは、ページ サイズのオフセットでマッピングを開始する必要があることです。オフセットでデータを取得したいだけの場合は、Xと互換性があるようにそのオフセットを修正する必要がありますmmap

そして最後に、読み取り/書き込みは、いくつかの種類のファイルを扱う唯一の方法です。次のようなものには使えmmapません。パイプそしてttys

おすすめ記事