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();
}
}

C#共享内存整理的更多相关文章

  1. linux下共享内存mmap和DMA(直接访问内存)的使用 【转】

    转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...

  2. IPC_共享内存

    在IPC(InterProcess Communication)的通信模式下,不管是使用消息队列还是共享内存,甚至是信号量,每个IPC的对象(object)都有唯一的名字,称为“键”(key).通过“ ...

  3. boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)

    本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...

  4. Linux环境进程间通信(五): 共享内存(上)

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  5. 【转】Linux环境进程间通信(五) 共享内存(上)

    转自:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以 ...

  6. mmap映射文件至内存( 实现 共享内存 与 文件的另类访问 )

    Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...

  7. C 共享内存封装

    引言 - 背景 2016 年写过一篇关于 linux 共享内存 shm api 扫盲文. C扩展 从共享内存shm到memcache外部内存 比较简单. 没有深入分析(能力有限, 也深入分析不了). ...

  8. Linux信号量同步共享内存实验.

    Linux信号量同步共享内存实验. Linux信号量同步共享内存实验. 简述 程序流程 信号量和共享内存的系统函数 信号量系统函数及接口 共享内存系统函数及接口 写程序 读程序 简述 本文主要内容是自 ...

  9. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

随机推荐

  1. 如何连接MSSQLSERVER2014(其他版本数据库大体相同)

    购买了服务器后我在上面安装了SqlServer2014,但是程序中总是远程连接不上,特此记录一下: 一.一些基本设置如下链接: 转载自:https://blog.sun0816.com/20381.h ...

  2. SPOJ Longest Common Substring II

    题目连接:戳我 题目大意:求n个字符串的最长公共子串. 它的简化版--这里 当然我们可以用SA写qwq,也可以用广义SAM写qwq 这里介绍纯SAM的写法...就是对其中一个建立后缀自动机,然后剩下的 ...

  3. 学习笔记_J2EE_SSM_01_spring+springMVC+Mybatis整合_XML配置示例

    spring+springMVC+Mybatis整合_XML配置示例 1.概述 spring+springMVC+Mybatis整合  XML配置方式 1.1 测试环境说明 名称 版本 备注 操作系统 ...

  4. C++派生类与基类对象赋值情况

    一 .普通赋值 (同名隐藏) 子类对象调用和父类相同的函数名,该父类的函数名会被隐藏,只会调用子类的函数. Class A { public: void show(); void show(int); ...

  5. Python 将时间戳转换为本地时间并进行格式化

    在python中,时间戳默认是为格林威治时间,而我们为东八区 使用localtime() 本地化时间戳 使用 strftime() 格式化时间戳 time = time.strftime('%Y%m% ...

  6. mysql中date,datetime,timestamp数据类型区别

    (1)date表示日期,其范围为1000-01-01到9999-12-31 (2)datetime表示日期时间,其范围是1000-01-01 00:00:00到9999-12-31 23:59:59 ...

  7. include与file_get_contents区别

    参考:http://www.cnblogs.com/bgwan/archive/2013/03/13/2957215.html 一,先来说file_get_contents         这个函数就 ...

  8. redis内存监控与回收

    Redis有自己的内存分配器,当key-value对象被移除时,Redis不会马上向操作系统释放其占用内存.redis之所以这样的设计有两个原因. OS可能会将释放内存交换到虚拟内存,但OS的虚拟内存 ...

  9. apicloud 基础

    时间成本  人力成本  很多人想开发app  又碍于时间和金钱成本 . 本色对app  要求不高的话. 混合app 开发是一种很好的方式. apicloud  就是一种很好的方式. apicloud ...

  10. Java零基础教程(一)环境搭建

    本文将带领您一步一步地搭建Java开发环境 一.认识什么是Java Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Window ...