原文:http://blog.csdn.net/wangtiewei/article/details/51112668

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用C语言的 memcpy等内存操作的函数。这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高

共享内存是内存映射文件的一种特殊情况,内存映射的是一块内存,而非磁盘上的文件。共享内存的主语是进程(Process),操作系统默认会给每一 个进程分配一个内存空间,每一个进程只允许访问操作系统分配给它的哪一段内存,而不能访问其他进程的。而有时候需要在不同进程之间访问同一段内存,怎么办 呢?操作系统给出了创建访问共享内存的API,需要共享内存的进程可以通过这一组定义好的API来访问多个进程之间共有的内存,各个进程访问这一段内存就 像访问一个硬盘上的文件一样。而.Net 4.0中引入了System.IO. MemoryMappedFiles命名空间,这个命名空间的类对windows 共享内存相关API做了封装,使.Net程序员可以更方便的使用内存映射文件。

在C#中使用共享内存。以下App1的代码让用户输入一行文本到共享内存中;App2不停的刷新控制台,输出最新的共享内存内容;App3实现的功能和App2相同,但读取方法不同。

 

  1. App1代码:
  2. using System;
  3. using System.Collections.Generic;android从资源文件中读取文件流显示
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO;
  7. //引用内存映射文件命名空间
  8. using System.IO.MemoryMappedFiles;
  9. namespace App1
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. long capacity = 1<<10<<10;
  16. //创建或者打开共享内存
  17. using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
  18. {
  19. //通过MemoryMappedFile的CreateViewAccssor方法获得共享内存的访问器
  20. var viewAccessor = mmf.CreateViewAccessor(0, capacity);
  21. //循环写入,使在这个进程中可以向共享内存中写入不同的字符串值
  22. while (true)
  23. {
  24. Console.WriteLine("请输入一行要写入共享内存的文字:");
  25. string input = Console.ReadLine();
  26. //向共享内存开始位置写入字符串的长度
  27. viewAccessor.Write(0, input.Length);
  28. //向共享内存4位置写入字符
  29. viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
  30. }
  31. }
  32. }
  33. }
  34. }
  1. App2代码:
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. //引用使用内存映射文件需要的命名空间
  8. using System.IO.MemoryMappedFiles;
  9. namespace App2
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. long capacity = 1<<10<<10;
  16. using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
  17. {
  18. MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);
  19. //循环刷新共享内存字符串的值
  20. while (true)
  21. {
  22. //读取字符长度
  23. int strLength = viewAccessor.ReadInt32(0);
  24. char[] charsInMMf = new char[strLength];
  25. //读取字符
  26. viewAccessor.ReadArray<char>(4, charsInMMf, 0, strLength);
  27. Console.Clear();
  28. Console.Write(charsInMMf);
  29. Console.Write("\r");
  30. Thread.Sleep(200);
  31. }
  32. }
  33. }
  34. }
  35. }
  1. App3代码:
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO.MemoryMappedFiles;
  7. using System.IO;
  8. namespace App3
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. long capacity = 1 << 10 << 10;
  15. //打开共享内存
  16. using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
  17. {
  18. //使用CreateViewStream方法返回stream实例
  19. using (var mmViewStream = mmf.CreateViewStream(0, capacity))
  20. {
  21. //这里要制定Unicode编码否则会出问题
  22. using (BinaryReader rdr = new BinaryReader(mmViewStream,Encoding.Unicode))
  23. {
  24. while (true)
  25. {
  26. mmViewStream.Seek(0, SeekOrigin.Begin);
  27. int length = rdr.ReadInt32();
  28. char[] chars = rdr.ReadChars(length);
  29. Console.Write(chars);
  30. Console.Write("\r");
  31. System.Threading.Thread.Sleep(200);
  32. Console.Clear();
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }

在读数据时用了2种方法。

因为在之前很少会用到进程之间的通信,所以此方法只是想初步的认识下。此程序写的过于简陋,有很多东西都没有去判断。比如说是怎么创建了一个共享内存怎么取删除它等等。。。

希望我与此篇博文的作者共勉吧。

c#实现内存映射文件共享内存的更多相关文章

  1. System.IO之内存映射文件共享内存

    内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就 像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数.这种方法能够很好的应用在需要频繁处理一个 ...

  2. kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)

    1 前景回顾 1.1 内核映射区 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供 ...

  3. linux编程之内存映射

    一.概述                                                   内存映射是在调用进程的虚拟地址空间创建一个新的内存映射. 内存映射分为2种: 1.文件映射 ...

  4. 使用Java内存映射(Memory-Mapped Files)处理大文件

    >>NIO中的内存映射 (1)什么是内存映射文件内存映射文件,是由一个文件到一块内存的映射,可以理解为将一个文件映射到进程地址,然后可以通过操作内存来访问文件数据.说白了就是使用虚拟内存将 ...

  5. 《Java核心技术卷二》笔记(二)文件操作和内存映射文件

    文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...

  6. Java NIO内存映射---上G大文件处理(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...

  7. Win 内存映射和堆栈

    内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...

  8. ZT 匿名内存映射

    mmap函数使用 分类: Linux/Unix C/C++ 2008-01-22 17:03 6089人阅读 评论(1) 收藏 举报 unix编程null网络 UNIX网络编程第二卷进程间通信对mma ...

  9. 【VS开发】内存映射文件3

    内存映射文件 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping).内存映射文件与虚拟内存有些类似,通过内存映射文 ...

随机推荐

  1. java数据结构之二叉树的定义和递归实现

    定义最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树.递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称为左 ...

  2. Maven 学习笔记(三)

    Maven生命周期 在上次我们使用maven package 对项目进行打包.这里就是为其指定一个生命周期.生命周期是包含在一个项目构建中的一系列有序的阶段.Maven有许多不同的生命周期,比如验证( ...

  3. 在Windows家里杀死一个偷端口的家伙

    今天,写项目了,写了好多代码,然后运行成功,但是返回的信息啥的还有代码整体的逻辑有点问题,于是就review了代码,改了些东西,然后再次启动服务,但是,问题来了:Address already in ...

  4. tomcat 日志详解

    1 tomcat  日志详解 1.1  tomcat 日志配置文件 tomcat 对应日志的配置文件:tomcat目录下的/conf/logging.properties. tomcat 的日志等级有 ...

  5. Innosetup新增Wizard Page

    Innosetup 新增一个向导页面,让用户选择安装方式 转载于:http://www.docin.com/p-612536939.html 在Innosetup的向导页面中,新增一个页面,提供两种安 ...

  6. 多流向算法GPU并行化

    和导师在Computers & Geosciences上发表的关于多流向算法GPU并行化的文章(SCI, IF=1.834). 论文:http://sourcedb.igsnrr.cas.cn ...

  7. 美化checkbox多选框

    看到那些UI框架都是有美化checkbox多选框的,不过大多是图片或者是字体图标.于是就利用label仿了个多选框效果. <!DOCTYPE html> <html lang=&qu ...

  8. Java 获取汉字串首字母并大写和获取汉字的全拼,英文字符不变

    在开发中我们难免会遇到需要提出汉字中的拼音的首字母.提出汉字的拼音,接着便介绍一个工具类 pinyin4j.jar,首先需要下载 jar 包. Pinyin4j是一个功能强悍的汉语拼音工具包,是sou ...

  9. linux下在线升级nodejs

    因现有项目需要用一个截屏node包,此包必须新版本,所以紧急升级下测试环境nodejs,后续再升级线上,小小试了下node在线升级 方案1,使用npm安装n模块,使用n来升级nodejs 首先要知道n ...

  10. 12.Reflect

    Reflect Reflect 概述 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明 ...