mmapドキュメントを見ています。ここそしてそれを使って達成しようこの動画。
実装にはいくつかの問題があります。
mmapはファイルマッピングを提供し、物理メモリ内の対応する場所へのポインタを返しますか、それともマッピングテーブルのアドレスを返しますか?ファイルスペースも割り当ててロックしますか?
ファイルがメモリ内の適切な場所に保存されると、munmapが呼び出されるまでそのまま残りますか?
ファイルがメモリに移動されましたか?それともリダイレクトとして使用されるマッピングテーブルであり、ファイルは実際には仮想メモリ(ディスク)にありますか?
メモリに移動すると仮定すると、他のプロセスがそのアドレスを持っている場合、その空間にアクセスしてデータを読み取ることができますか?
答え1
質問に順番に答えてください。
- 位置へのポインタを返します。仮想仮想メモリアドレス空間が割り当てられているが明示的にロックされていない限り、ファイルはどのような方法でもロックされません(また、メモリロックはファイルの領域をロックするのと同じではありません)。ページングと仮想メモリのため、mmap()の効率的な実装は実際の観点からしか見えません(そうでない場合は、領域全体をメモリに読み込む必要があります)。今後通話完了)。
- 正確ではありませんが、次の回答に関連しているので、ここで説明します。
- ほとんど。ほとんどの場合、実際に起こるのは、mmap()がページキャッシュ内のファイルデータへの書き込み中にコピーアクセスを提供することです。したがって、データ寿命に対する一般的なキャッシュ制限が適用されます。システムにスペースが必要な場合は、ページをキャッシュから削除することができ(または汚れている場合はディスクにフラッシュ)、再度失敗する必要があります。
- いいえ、仮想メモリの動作方法によるものです。各プロセスには独自の仮想アドレス空間と仮想マッピングがあります。データ通信を希望するすべてのプログラムは、同じファイル(または共有メモリセグメント)でmmap()を呼び出す必要があり、すべてこの
MAP_SHARED
フラグを使用する必要があります。
mmap() がファイルだけで動作するのではなく、次のような他のタスクも実行できることに注目する価値があります。
- デバイスメモリを直接マッピングします(十分な権限がある場合)。これは、新しいハードウェア用のカーネルモードドライバを作成する必要を避けるために、多くの組み込みシステムで実際に使用されます。
- 共有メモリセグメントをマッピングします。
- 大規模なページを明示的にマッピングします。
- 呼び出せるメモリ割り当てクレイジーウェス(2)これにより、データが子プロセスにコピーされるのを防ぐなど、いくつかの便利なタスクを実行できます。フォーク(2)またはラベル付きデータケースマン、Linuxメモリ重複排除機能。