MMF からプルするときに、ローカル アプリ プロセスが共有メモリ内のコンテンツ用に独自のメモリ ストレージを作成するかどうかを確実に知っている人はいますか? それともメモリを直接参照していますか?
MMF で 4 GB のファイルを使用することを考えているため、この質問をします。リソースを使用する各アプリ (プロセス) のローカル メモリをプルダウンすると、大量の RAM が表示されます。何か案は?
MMF からプルするときに、ローカル アプリ プロセスが共有メモリ内のコンテンツ用に独自のメモリ ストレージを作成するかどうかを確実に知っている人はいますか? それともメモリを直接参照していますか?
MMF で 4 GB のファイルを使用することを考えているため、この質問をします。リソースを使用する各アプリ (プロセス) のローカル メモリをプルダウンすると、大量の RAM が表示されます。何か案は?
マップされたメモリはコピーされません。デマンド ロードおよびデマンド アンロードされます。
マッピングするだけでは何もしません。アクセスしたものだけをロードし、OS はそれが正しいと判断したときにいつでもメモリをアンロードできます。
また、マップされた同じファイルのメモリはプロセス間で共有されます。
基本的に 2 種類のメモリ マッピングがあります。最も一般的なのは、 によって取得される共有マッピングですMemoryMappedFile.CreateFromFile(string)
。共有マッピングは通常、IO キャッシュ メモリ ページを使用してファイル コンテンツを保持し、マップされたファイルの対応する部分にアクセスするプロセスの仮想アドレス空間にそれらのページをマップします。ファイルの常駐部分の合計サイズと同じだけのメモリを消費します。また、このコンテンツの出入り先となる物理メディアがあるため、OS はメモリが不足しているときにいつでもこのメモリを解放できます (その前にダーティ ページをディスクに書き込むことによって)。
プライベートまたは CoW (Copy-on-Write) マッピングと呼ばれる別のマッピング タイプがあります。最初は共有マッピングと非常によく似ていますが、プロセスがその一部に書き込むと、このプロセス専用の新しいメモリページが作成され、元のページの内容がそこにコピーされます (したがって、copy on write ) . この新しいメモリ ページはプロセス専用であり、元のファイルではなく、システム ページ ファイルによってバックアップされます。したがって、プライベート マッピングは追加のメモリを消費し、1 つのプロセスによって行われた変更は他のプロセスには表示されません。プライベート マッピングはMemoryMappedFile.CreateFromFile(path, mode, map, capacity, access)
with access
set toを使用して作成されSystem.IO.MemoryMappedFiles.MemoryMappedFileAccess.CopyOnWrite
ます。