Mmap はいくつかの点で役立ちます。いくつかの仮説的な例で説明します。
最初に: メモリが不足していて、100MB の malloc メモリ チャンクを持つアプリケーションがその 50% をスワップ アウトしたとします。つまり、OS はスワップファイルに 50MB を書き込む必要がありました。それを読み返す必要があります.50MBのスワップファイルを書き込んで占有し、再度読み戻します.
メモリが mmap されたばかりの場合、オペレーティング システムはその情報をスワップファイルに書き込まず (そのデータがファイル自体と同一であることを認識しているため)、代わりに 50MB の情報をスクラッチします (再び:あなたが今のところ何も書いていないと仮定します)そしてそれはそれです。そのメモリを再度読み取る必要がある場合、OS はスワップファイルからではなく、mmap した元のファイルからコンテンツをフェッチするため、他のプログラムが 50MB のスワップを必要とする場合、それらは利用可能です。また、スワップファイル操作によるオーバーヘッドはまったくありません。
100MB のデータ チャンクを読み取ったとします。ヘッダー データの最初の 1MB によると、必要な情報はオフセット 75MB にあるため、1 ~ 74.9MB の間は何も必要ありません。コードを単純にするためだけに読んでいます。mmap を使用すると、実際にアクセスしたデータ (丸められた 4kb、またはほとんどが 4kb である OS ページ サイズ) のみを読み取るため、最初と 75 MB のみを読み取ることになります。ファイルの mmap よりも、ディスクの読み取りを回避するためのより簡単で効果的な方法を作成するのは非常に難しいと思います。何らかの理由でオフセット 37MB のデータが必要な場合は、そのまま使用できます。ファイル全体がメモリ内でアクセスできるため、再度 mmap する必要はありません (もちろん、プロセスのメモリ空間によって制限されます)。
mmap されたすべてのファイルは、swapfile によってではなく、それ自体によってバックアップされます。swapfile は、バックアップするファイルを持たないデータを許可するように作成されます。これは通常、データ malloc されるか、ファイルによってバックアップされるデータです。 、しかし、それは変更されており、プログラムが実際に msync 呼び出しを介して OS にそうするように指示する前に、[できません/できない] それに書き戻されます。
メモリ内のファイル全体をマップする必要はないことに注意してください。任意の場所 (6 番目の引数 - 「off_t オフセット」) から開始して任意の量 (2 番目の引数は「size_t 長さ」) をマップできますが、ファイルが可能性が高い場合を除きます。システムが64MBの物理メモリしかパックしていなくても、1GBのデータを恐れることなく安全にマップできますが、それは読み取り用です。書き込みを計画している場合は、より保守的になり、必要なものだけをマップする必要があります.
ファイルのマッピングは、コードをより単純にするのに役立ちます (メモリ上にファイルの内容が既にあり、使用する準備ができており、匿名メモリではないため、メモリのオーバーヘッドがはるかに少なくなります)、より高速になります (プログラムがアクセスしたデータのみを読み取ることができます)。