MMAPについて


9

ここでMMAPに関するドキュメントを調べていて、これを使用して実装しようとしました

その実装について、いくつか疑問があります。

  1. MMAPはファイルのマッピングを提供し、物理メモリ内のその場所のポインターを返しますか、それともマッピングテーブルのアドレスを返しますか?そして、そのファイルにもスペースを割り当ててロックしますか?

  2. ファイルがメモリ内のその場所に保存されたら、munmapが呼び出されるまでファイルはそのまま残りますか?

  3. ファイルはメモリに移動されますか、それともリダイレクトとして機能する単なるマッピングテーブルであり、ファイルは実際には仮想メモリ(ディスク)にありますか?

  4. メモリに移動されたと仮定すると、他のプロセスがアドレスを持っている場合、そのスペースにアクセスしてデータを読み取ることができますか?


2
あなたはしていない実装 mmapが、あなたはしている使用してそれを
バジーレStarynkevitch

回答:


12

順番に答える:

  1. 仮想メモリ内の場所へのポインタを返し、仮想メモリアドレス空間が割り当てられますが、明示的にロックしない限り、ファイルはロックされません(メモリのロックは、ファイル)。mmap()の効率的な実装は、実際にはページングと仮想メモリのために実際的な観点からのみ可能です(そうでない場合、呼び出しが完了する前に領域全体をメモリ読み込む必要があります)。
  2. 正確ではありませんが、これは次の回答と結びついているので、ここで取り上げます。
  3. やや。ほとんどの場合、実際に起こっていることは、mmap()がページキャッシュ内のそのファイルのデータへのコピーオンライトアクセスを提供していることです。その結果、データの有効期間に関する通常のキャッシュ制限が適用され(システムにスペースが必要な場合、ページがキャッシュから削除(またはダーティになっている場合はディスクにフラッシュ)され、再度フォールトする必要があります)。
  4. いいえ、仮想メモリの仕組みのためです。各プロセスには独自の仮想アドレス空間があり、独自の仮想マッピングがあります。データを通信するすべてのプログラムは、同じファイル(または共有メモリセグメント)でmmap()を呼び出す必要があり、すべてのプログラムがMAP_SHAREDフラグを使用する必要があります。

mmap()はファイルに対して機能するだけでなく、次のような他のことも実行できることに注意してください。

  • デバイスメモリを直接マッピングします(十分な権限がある場合)。これは、実際には多くの組み込みシステムで使用され、新しいハードウェア用のカーネルモードドライバーを作成する必要がありません。
  • 共有メモリセグメントをマップします。
  • 巨大なページを明示的にマップします。
  • madvise(2)を呼び出すことができるメモリを割り当てます(これにより、fork(2)で子プロセスにデータがコピーされないようにしたり、KSM(Linuxのメモリ重複排除機能)のデータにマークを付けたりすることができます)。

そのような詳細な回答をありがとう。ポイント1の説明です。返された仮想メモリアドレスにアクセスしようとした場合。最初にプロセス用に作成されたアドレスマップを通過し、実際の場所(ディスク、キャッシュ、またはメモリ)にリダイレクトされます。次に、MAP_SHAREDフラグがオンで、両方のプロセスのテーブルが物理アドレスに対して同じ値を返した場合、ファイルを共有できますか?
ジョン

1.はい、仮想メモリマッピングテーブルを使用します。2.各プロセスのアドレスは重要ではなく、同じファイルの同じ領域をMAP_SHAREDでマップしているという事実だけです。
オースティンヘンメルガーン2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.