1. ホーム
  2. c

[解決済み】ファイルアクセスにmmapを使用するのはどんな場合ですか?

2022-03-29 16:23:49

質問

POSIX環境では、ファイルにアクセスする方法が少なくとも2つ用意されています。 一つは標準的なシステムコール open() , read() , write() というオプションもあります。 mmap() を使用して、ファイルを仮想メモリにマッピングします。

どのような場合にどちらを使うのが望ましいのでしょうか? また、2つのインターフェイスを搭載するメリットは何でしょうか?

どのように解決するのですか?

mmap は、複数のプロセスが同じファイルから読み取り専用でデータにアクセスする場合に最適です。これは、私が書いているようなサーバーシステムでよくあることです。 mmap を使用すると、すべてのプロセスが同じ物理メモリページを共有することができ、多くのメモリを節約することができます。

mmap また、オペレーティングシステムがページング操作を最適化することも可能です。 例えば、2つのプログラムを考えてみましょう。 A を読み込むと 1MB で作成したバッファに malloc というプログラムBと mmaps 1MBのファイルをメモリに格納します。 もしオペレーティングシステムが A のメモリーを再利用する前に、バッファーの内容をスワップに書き込まなければなりません。 で B の場合、変更されていないすべての mmap d ページは、OS が既存のファイルから復元する方法を知っているので、すぐに再利用することができます。 mmap を元にしたものです。 (OSはどのページが変更されていないかを検出するために、最初に書き込み可能な mmap d ページを読み取り専用とし セグメンテーション違反 と同じように コピーオンライト の戦略)。

mmap にも有効です。 プロセス間通信 . 以下のことが可能です。 mmap を通信が必要なプロセスで読み取り/書き込みとして使用し、同期プリミティブを使用します。 mmap'd 領域(これが MAP_HASSEMAPHORE フラグはそのためのものです)。

一箇所 mmap が厄介なのは、32ビットマシンで非常に大きなファイルを扱う必要がある場合です。 これは mmap は、マップされるファイルの全範囲を収めるのに十分な大きさの連続したアドレスブロックを、プロセスのアドレス空間から見つけなければなりません。 これは、アドレス空間が断片化した場合に問題となります。例えば、2 GB のアドレス空間が空いていても、その中の個々の範囲が 1 GB のファイルマッピングに適合しないことがあります。 この場合、ファイルを小さく分割してマッピングしなければならないかもしれません。

もう一つの厄介な点は mmap を読み書きの代わりに使う場合、ページサイズのオフセットでマッピングを開始しなければなりません。 もし、あるデータをオフセット X と互換性があるように、そのオフセットを修正する必要があります。 mmap .

そして最後に、read / writeは、あなたが できる は、ある種のファイルを扱うことができます。 mmap のようなものには使用できません。 パイプ タイ .