C#共享内存整理

1.System.IO.MemoryMappedFiles 内存映射文件

内存映射文件将文件的内容映射到应用程序的逻辑地址空间。 内存映射文件使程序员得以处理极大的文件(这是因为可以并发管理内存),并且它们允许对文件进行完整的随机访问而不需要查找文件。 内存映射文件还可以在多个进程之间进行共享。

CreateFromFile 方法基于磁盘上的现有文件的指定路径或 FileStream 创建一个内存映射文件。 未映射映射文件时,更改都将自动传播到磁盘。

CreateNew 方法创建一个未映射到磁盘上的现有文件的内存映射文件;而且这些方法还适合创建用于进程间通信 (IPC) 的共享内存。

内存映射文件与名称相关联。

您可以创建内存映射文件的多个视图,包括部分文件的视图。 可以将某个文件的相同部分映射到多个地址,以创建并发内存。 为了使两个视图能够并发,必须基于同一内存映射文件创建这两个视图。 对同一文件创建两个文件映射的两个视图不具有并发性。(https://msdn.microsoft.com/zh-cn/library/system.io.memorymappedfiles.memorymappedfile(v=vs.100).aspx)

常用函数:

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static MemoryMappedFile CreateOrOpen(
    string mapName, //要分配给内存映射文件的名称。
    long capacity,//要分配给内存映射文件的最大大小(以字节为单位)。
    MemoryMappedFileAccess access,//用于指定内存映射文件允许的访问类型的枚举值之一。 默认值为 ReadWrite
    MemoryMappedFileOptions options,//枚举值的按位组合,用于为内存映射文件指定内存分配选项。
    MemoryMappedFileSecurity memoryMappedFileSecurity,//可以针对内存映射文件授予的文件访问和操作权限。此参数可以为 null。
    HandleInheritability inheritability//用于指定内存映射文件的句柄能否由子进程继承的枚举值之一。 默认值为 None
)
在系统内存中创建或打开一个具有指定容量、访问类型、内存分配、安全权限和继承性的内存映射文件。
使用此方法创建或打开一个不持久保留的内存映射文件(即,不与磁盘上的文件关联),您可以使用该文件在进程之间共享数据。
using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
{
    //通过MemoryMappedFile的CreateViewAccssor方法获得共享内存的访问器  
    var viewAccessor = mmf.CreateViewAccessor(0, capacity);
viewAccessor.Write(0, input.Length);
   //向共享内存4位置写入字符  
   viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
}
public static MemoryMappedFile CreateNew(
    string mapName, //要分配给内存映射文件的名称。
    long capacity   //要分配给内存映射文件的最大大小(以字节为单位)。
)
使用此方法创建一个不持久保留的内存映射文件(即,不与磁盘上的文件关联),您可以使用该文件在进程之间共享数据。
 static void Main(string[] args)
 {
     using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
     {
         bool mutexCreated;
         Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
         using (MemoryMappedViewStream stream = mmf.CreateViewStream())
         {
             BinaryWriter writer = new BinaryWriter(stream);
             writer.Write(1);
         }
         mutex.ReleaseMutex();
         mutex.WaitOne();
         using (MemoryMappedViewStream stream = mmf.CreateViewStream())
         {
             BinaryReader reader = new BinaryReader(stream);
             Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
             Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
             Console.WriteLine("Process C says: {0}", reader.ReadBoolean());
         }
         mutex.ReleaseMutex();
     }
 }

猜你喜欢

转载自www.cnblogs.com/cteng-common/p/9038741.html