Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET 4内存映射文件_.net_C# 4.0_Shared Memory - Fatal编程技术网

.NET 4内存映射文件

.NET 4内存映射文件,.net,c#-4.0,shared-memory,.net,C# 4.0,Shared Memory,是否有人知道当您从MMF中提取时,本地应用程序进程是否为共享内存中的内容创建了自己的内存存储?还是直接引用内存 我问这个问题是因为我正在考虑在MMF中使用4gb文件,如果它为每个使用该资源的应用程序(进程)拉低本地内存,我将看到大量的RAM。有什么想法吗?映射内存不会被复制到内存中。它按需加载,也按需卸载 只是映射它什么都不做。您只加载您访问的内容,操作系统可以在它认为正确的时候卸载内存 同一映射文件的内存也在进程之间共享。基本上有两种内存映射。最常见的是通过MemoryMappedFile.C

是否有人知道当您从MMF中提取时,本地应用程序进程是否为共享内存中的内容创建了自己的内存存储?还是直接引用内存


我问这个问题是因为我正在考虑在MMF中使用4gb文件,如果它为每个使用该资源的应用程序(进程)拉低本地内存,我将看到大量的RAM。有什么想法吗?

映射内存不会被复制到内存中。它按需加载,也按需卸载

只是映射它什么都不做。您只加载您访问的内容,操作系统可以在它认为正确的时候卸载内存


同一映射文件的内存也在进程之间共享。

基本上有两种内存映射。最常见的是通过
MemoryMappedFile.CreateFromFile(string)
获得的共享映射。共享映射通常使用IO缓存内存页来保存文件内容,并将这些页映射到访问映射文件相应部分的进程的虚拟地址空间中。它只消耗与文件中驻留部分的总大小相同的内存。而且,由于有一个物理介质,这些内容来自/前往,所以只要内存不足,操作系统就可以释放这些内存(通过在内存不足之前将脏页写入磁盘)


还有另一种映射类型,称为private或CoW(写时复制)映射。最初,它的工作原理非常类似于共享映射,但当任何进程写入其中的任何部分时,将创建一个新的内存页(此进程专用),并将原始页的内容复制到其中(因此是写时复制)。这个新内存页是进程专用的,它不是由原始文件备份的,而是由系统页文件备份的。因此,私有映射会消耗额外的内存,并且一个进程所做的更改在其他进程中不可见。私有映射是使用
MemoryMappedFile.CreateFromFile(路径、模式、映射、容量、访问)
创建的,其中
access
设置为
System.IO.MemoryMappedFiles.MemoryMappedFileAccess.CopyOnWrite
内存映射对象上有任何输入吗?如果这是一个不同的问题,你最好问一个新的。