POSIX 環境では、ファイルにアクセスする方法が少なくとも 2 つあります。標準のシステム コールopen()
、、、および類似のものがありますが、 を使用してファイルを仮想メモリにマップするオプションもあります。read()
write()
mmap()
どちらか一方を使用する方がよいのはどのような場合ですか? 2 つのインターフェースを含める価値があるそれぞれのメリットは何ですか?
ベストアンサー1
mmap
これは、複数のプロセスが同じファイルから読み取り専用でデータにアクセスする場合に最適です。これは、私が作成する種類のサーバー システムでは一般的です。mmap
すべてのプロセスが同じ物理メモリ ページを共有できるため、大量のメモリを節約できます。
mmap
また、オペレーティングシステムはページング操作を最適化することもできます。たとえば、で作成されたバッファにファイルA
を読み込むプログラムと、1MB のファイルをメモリに読み込むプログラム B という 2 つのプログラムを考えてみましょう。オペレーティングシステムがのメモリの一部をスワップアウトする必要がある場合、メモリを再利用する前にバッファの内容をスワップに書き込む必要があります。 の場合、変更されていないのページは、OS が元のファイルから復元する方法を知っているため、すぐに再利用できます。(OS は、最初に書き込み可能な のページを読み取り専用としてマークし、変更されたページをキャッチすることで、変更されていないページを検出できます。1MB
malloc
mmaps
A
B
mmap
mmap
mmap
セグメント障害、 に似ているコピーオンライト戦略)。
mmap
にも役立ちますプロセス間通信mmap
通信する必要があるプロセスでファイルを読み取り/書き込みとして設定し、領域内で同期プリミティブを使用できますmmap'd
(これがMAP_HASSEMAPHORE
フラグの目的です)。
厄介なのmmap
は、32 ビット マシンで非常に大きなファイルを操作する必要がある場合です。これは、mmap
プロセスのアドレス空間で、マップされるファイルの全範囲に適合するのに十分な大きさの連続したアドレス ブロックを見つける必要があるためです。アドレス空間が断片化されると、2 GB の空きアドレス空間があっても、その個々の範囲が 1 GB のファイル マッピングに適合しないなど、問題が発生する可能性があります。この場合、ファイルを、収まるようにしたいよりも小さなチャンクにマップする必要がある可能性があります。
を read / write の代わりとして使用する場合のもう 1 つの潜在的な問題mmap
は、ページ サイズのオフセットでマッピングを開始する必要があることです。オフセットでデータを取得したいだけの場合は、X
と互換性があるようにそのオフセットを修正する必要がありますmmap
。
そして最後に、読み取り/書き込みは、いくつかの種類のファイルを扱う唯一の方法です。次のようなものには使えmmap
ません。パイプそしてttys。