c#实现内存映射文件共享内存
原文: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相同,但读取方法不同。
- App1代码:
- using System;
- using System.Collections.Generic;android从资源文件中读取文件流显示
- using System.Linq;
- using System.Text;
- using System.IO;
- //引用内存映射文件命名空间
- using System.IO.MemoryMappedFiles;
- namespace App1
- {
- class Program
- {
- static void Main(string[] args)
- {
- long capacity = 1<<10<<10;
- //创建或者打开共享内存
- using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
- {
- //通过MemoryMappedFile的CreateViewAccssor方法获得共享内存的访问器
- var viewAccessor = mmf.CreateViewAccessor(0, capacity);
- //循环写入,使在这个进程中可以向共享内存中写入不同的字符串值
- while (true)
- {
- Console.WriteLine("请输入一行要写入共享内存的文字:");
- string input = Console.ReadLine();
- //向共享内存开始位置写入字符串的长度
- viewAccessor.Write(0, input.Length);
- //向共享内存4位置写入字符
- viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
- }
- }
- }
- }
- }
- App2代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- //引用使用内存映射文件需要的命名空间
- using System.IO.MemoryMappedFiles;
- namespace App2
- {
- class Program
- {
- static void Main(string[] args)
- {
- long capacity = 1<<10<<10;
- using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
- {
- MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);
- //循环刷新共享内存字符串的值
- while (true)
- {
- //读取字符长度
- int strLength = viewAccessor.ReadInt32(0);
- char[] charsInMMf = new char[strLength];
- //读取字符
- viewAccessor.ReadArray<char>(4, charsInMMf, 0, strLength);
- Console.Clear();
- Console.Write(charsInMMf);
- Console.Write("\r");
- Thread.Sleep(200);
- }
- }
- }
- }
- }
- App3代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO.MemoryMappedFiles;
- using System.IO;
- namespace App3
- {
- class Program
- {
- static void Main(string[] args)
- {
- long capacity = 1 << 10 << 10;
- //打开共享内存
- using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
- {
- //使用CreateViewStream方法返回stream实例
- using (var mmViewStream = mmf.CreateViewStream(0, capacity))
- {
- //这里要制定Unicode编码否则会出问题
- using (BinaryReader rdr = new BinaryReader(mmViewStream,Encoding.Unicode))
- {
- while (true)
- {
- mmViewStream.Seek(0, SeekOrigin.Begin);
- int length = rdr.ReadInt32();
- char[] chars = rdr.ReadChars(length);
- Console.Write(chars);
- Console.Write("\r");
- System.Threading.Thread.Sleep(200);
- Console.Clear();
- }
- }
- }
- }
- }
- }
- }
在读数据时用了2种方法。
因为在之前很少会用到进程之间的通信,所以此方法只是想初步的认识下。此程序写的过于简陋,有很多东西都没有去判断。比如说是怎么创建了一个共享内存怎么取删除它等等。。。
希望我与此篇博文的作者共勉吧。
c#实现内存映射文件共享内存的更多相关文章
- System.IO之内存映射文件共享内存
内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就 像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数.这种方法能够很好的应用在需要频繁处理一个 ...
- kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)
1 前景回顾 1.1 内核映射区 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供 ...
- linux编程之内存映射
一.概述 内存映射是在调用进程的虚拟地址空间创建一个新的内存映射. 内存映射分为2种: 1.文件映射 ...
- 使用Java内存映射(Memory-Mapped Files)处理大文件
>>NIO中的内存映射 (1)什么是内存映射文件内存映射文件,是由一个文件到一块内存的映射,可以理解为将一个文件映射到进程地址,然后可以通过操作内存来访问文件数据.说白了就是使用虚拟内存将 ...
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...
- Java NIO内存映射---上G大文件处理(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...
- Win 内存映射和堆栈
内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...
- ZT 匿名内存映射
mmap函数使用 分类: Linux/Unix C/C++ 2008-01-22 17:03 6089人阅读 评论(1) 收藏 举报 unix编程null网络 UNIX网络编程第二卷进程间通信对mma ...
- 【VS开发】内存映射文件3
内存映射文件 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping).内存映射文件与虚拟内存有些类似,通过内存映射文 ...
随机推荐
- YYYY-mm-dd HH:MM:SS 时间格式
YYYY-mm-dd HH:MM:SS部分解释 d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. ...
- JavaScript 函数的4种调用方法
JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. 作为一个函数调用 function myFunction(a, b) { return a * b; } ...
- 钉钉h5项目实战|仿钉钉聊天|h5移动端钉钉案例
最近一直着手开发h5仿钉钉项目,使用到了h5+css3+zepto+wcPop2等技术进行开发,实现了消息.表情.动图发送,仿QQ多人拼合图像,可以选择本地图片,并可以图片.视频预览,仿微信发红包及打 ...
- Java Web入门学习(三)Maven的配置与使用国内仓库
一.Maven下载与配置 下载好的压缩包,压缩到D盘,或者其他盘符. 新建系统环境变量 MAVEN_HOME 值是压缩好的Maven目录. 比如: D:\apache-maven- 在path环境变 ...
- 【链表】Linked List Cycle II
题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...
- NiftyDialogEffects-多种弹出效果的对话框
感觉系统自带的对话框弹出太生硬?那就试试NiftyDialogEffects吧,类似于(Nifty Modal Window Effects),效果是模仿里面实现的 ScreenShot . . ...
- ELK日志系统之通用应用程序日志接入方案
前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的 日志规范 规范的日志存放路径和 ...
- 数据库报错com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'ua' at row 1
记一次报错记录,成长路上的点滴 明明使用浏览器或者微信开发工具调试接口没有问题,但是在真机测试时候就出问题了.(((¬_¬)) 500服务器内部错误,要死的节奏啊 登陆tomcat服务器 使用命令ta ...
- Python开发工具,服务器框架等
python服务器框架:uWSGI WEB服务器.mod_WS.Meinheld.Gunicorn.CherryPy.Bjoern 查看python内部模块命令,内置函数,查看python已经安装的模 ...
- 机器学习--boosting家族之GBDT
本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 以下简称GBDT)做一个总结.GBDT有很多简称,有GBT(Gradient ...