順番に答える:
- 仮想メモリ内の場所へのポインタを返し、仮想メモリアドレス空間が割り当てられますが、明示的にロックしない限り、ファイルはロックされません(メモリのロックは、ファイル)。mmap()の効率的な実装は、実際にはページングと仮想メモリのために実際的な観点からのみ可能です(そうでない場合、呼び出しが完了する前に領域全体をメモリに読み込む必要があります)。
- 正確ではありませんが、これは次の回答と結びついているので、ここで取り上げます。
- やや。ほとんどの場合、実際に起こっていることは、mmap()がページキャッシュ内のそのファイルのデータへのコピーオンライトアクセスを提供していることです。その結果、データの有効期間に関する通常のキャッシュ制限が適用され(システムにスペースが必要な場合、ページがキャッシュから削除(またはダーティになっている場合はディスクにフラッシュ)され、再度フォールトする必要があります)。
- いいえ、仮想メモリの仕組みのためです。各プロセスには独自の仮想アドレス空間があり、独自の仮想マッピングがあります。データを通信するすべてのプログラムは、同じファイル(または共有メモリセグメント)でmmap()を呼び出す必要があり、すべてのプログラムが
MAP_SHARED
フラグを使用する必要があります。
mmap()はファイルに対して機能するだけでなく、次のような他のことも実行できることに注意してください。
- デバイスメモリを直接マッピングします(十分な権限がある場合)。これは、実際には多くの組み込みシステムで使用され、新しいハードウェア用のカーネルモードドライバーを作成する必要がありません。
- 共有メモリセグメントをマップします。
- 巨大なページを明示的にマップします。
- madvise(2)を呼び出すことができるメモリを割り当てます(これにより、fork(2)で子プロセスにデータがコピーされないようにしたり、KSM(Linuxのメモリ重複排除機能)のデータにマークを付けたりすることができます)。
mmap
が、あなたはしている使用してそれを