c# 通过内存映射实现文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用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种方法。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们该如何学习机器学习中的数学

数学在机器学习中非常重要&#xff0c;不论是在算法上理解模型代码&#xff0c;还是在工程上构建系统&#xff0c;数学都必不可少。通常离开学校后很难有机会静下心学习数学知识&#xff0c;因此我们最好能通过阅读小组或读书会等形式营造环境&#xff0c;并专注学习那些在实践…

标准梯度—lhMorpGradient

标准梯度 5*5正方形结构元素 标准梯度 7*7正方形结构元素 函数&#xff1a;lhMorpGradient 说明&#xff1a;形态学基本梯度运算&#xff0c;通过结构元素的改变&#xff0c;可以进行厚梯度&#xff0c;方向梯度等形态学计算 参数&#xff1a; src 输入图像 dst 输出图像 eleme…

神州云科DCN存储管理IP_干货!DCN校园网大二层解决方案详解

安徽水利水电职业技术学院始建于195年&#xff0c;是全国100所和安徽省3所国家示范性高职院校之一。学院坐落于安徽省省会合肥&#xff0c;交通便利&#xff0c;环境优美。校内设有九大实训中心&#xff0c;拥有实践性教学所必须的各类实验室、实训室、实习工厂等130个&#xf…

国产数据库占央采九成份额

3月&#xff0c;中央政府采购网发布《中国国家机关2021年数据库软件协议供货采购项目》成交公告&#xff0c;从入选采购名录的企业来看&#xff0c;除甲骨文和微软之外&#xff0c;其余入围的三十家企业均为本土企业。三十家本土企业中&#xff0c;既有阿里这种互联网巨头&…

应对程序员面试,你必须知道的8大数据结构

瑞士计算机科学家Niklaus Wirth在1976年写了一本书&#xff0c;名为《算法数据结构编程》。40多年后&#xff0c;这个等式仍被奉为真理。这就是为什么在面试过程中&#xff0c;需要考察软件工程师对数据结构的理解。几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是…

Windows Phone 知识锦(12月版)

很久没有更新Windows Phone 知识锦了&#xff0c;今天更新一下&#xff1a;将不同分类的文章进行归类&#xff0c;方便大家查看。 相信大家都喜欢jeffblankenburg的windows phone 31日开放谈吧&#xff0c;之前金山将它反映为中文了。如今他有退出了Mango版的31日开发谈&#…

自由、开源及其敌人 —— RMS事件簿

点击上方“开源社”关注我们| 作者&#xff1a;庄表伟| 编辑&#xff1a;沈于蓝| 设计&#xff1a;朱亿钦目前国际开源界和一些开源软件基金会对于道德和平权的争论正方兴未艾&#xff0c;我们觉得值得关注与了解。前置申明这是一篇严肃的八卦文&#xff0c;希望搞清楚一些社区…

Google 机器学习应用的43条经验法则

Google 的研究科学家 Martin Zinkevich 曾在 NIPS 2016 Workshop 分享了谷歌机器学习实践的四十三条法则。Martin Zinkevich 也在自己的博客上分享了这四十三条经验法则。文章《Rules of Machine Learning: Best Practices for ML Engineering》旨在帮助具备机器学习基础知识的…

lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合

本文整理自&#xff1a;ThinkWon 链接&#xff1a;blog.csdn.net/ThinkWon/article/details/104390752本文知识目录1、Java内存区域说一下 JVM 的主要组成部分及其作用&#xff1f;说一下 JVM 运行时数据区深拷贝和浅拷贝说一下堆栈的区别&#xff1f;队列和栈是什么&#xff…

SQL Server CDC配合Kafka Connect监听数据变化

写在前面好久没更新Blog了&#xff0c;从CRUD Boy转型大数据开发&#xff0c;拉宽了不少的知识面&#xff0c;从今年年初开始筹备、组建、招兵买马&#xff0c;到现在稳定开搞中&#xff0c;期间踏过无数的火坑&#xff0c;也许除了这篇还很写上三四篇。进入主题&#xff0c;通…

Wiwiz无线Web认证实现限速

一直在用Wiwiz做Web认证和Wifi计费&#xff0c;感觉还是很好的。 关于Wiwiz虚拟机设置的方法请参考以前的帖子&#xff1a;http://itbbs.pconline.com.cn/network/13162214.html 美中不足的是&#xff0c;Wiwiz本身并不带限速&#xff0c;无线网络中有人占用带宽很多时有点郁闷…

惊喜开学季,教你如何在人工智能时代站稳脚跟!

暑假咻地一下过完啦&#xff0c;前几天&#xff0c;小天介绍了关于数模课程的开学季限时优惠&#xff08;传送门&#xff09;&#xff0c;今天要介绍的是python课程。接下来&#xff0c;小天来详细说明一下&#xff01;领取方式&#xff1a;公众号后台对话框回复“人工智能”免…

矢量合成和分解的法则_力的合成与分解专题解析,寒假复习!

合力与分力如果几个力共同作用在物体上产生的效果与一个力单独作用在物体上产生的效果相同&#xff0c;则把这个力叫做这几个力的合力&#xff0c;而那几个力叫做这一个力的分力。合力与分力的关系是等效替代关系&#xff0c;即一个力若分解为两个分力&#xff0c;在分析和计算…

.NET WebSocket 核心原理初体验

上个月我写了《.NET gRPC核心功能初体验》&#xff0c; 里面使用gRPC双向流做了一个打乒乓球的Demo&#xff0c; [实时][双向]这两个标签是不是很熟悉&#xff0c;对&#xff0c; WebSockets也可以做实时双向通信。本文将利用WebSockets(SignalR的一部分)搭建一个可双向通信的A…

CvBlobDetector 新目标检测算法简析

CvBlobDetector用于检测和判定当前帧中的Blob是否是新产生的目标&#xff0c;方法如下&#xff1a;

原来这些流弊的老板,曾经还是牛逼的程序猿!

“生活就像巧克力&#xff0c;你永远不知道下一颗是什么味道”&#xff0c;这句话用在互联网最适合不过&#xff0c;互联网从人类里面创造了一批神&#xff0c;说起他们的名字无人不知&#xff0c;但是你可知道这些神曾经也只是一个名不见经传的程序员。一起来看看他们是怎么一…

phpstormp新建PHP保存在哪里_记一次windows配置PHP环境

前言因为疫情原因一直不能回学校&#xff0c;电脑还在学校宿舍&#xff0c;所以在笔记本上搭建PHP环境&#xff0c;总不能在家混吃等死吧。正文【0】安装Apache2.40-0:Apache的下载链接The Apache HTTP Server Project0-1:点击a number of third party vendors下载window版本0-…

OCFS2在Linux下配置文档

1、 简介 OCFS2是下一代的ORACLE集群文件系统&#xff0c;它已经被设计成为一种为通用的文件系统。OCFS2能使运行在集群中所有节点并发的通过标准文件系统接口来访问存储备。 2、 下载 OCFS2的发行版包括了2个安装包&#xff0c;一个称为核心模块&#xff0c;另一个叫工具包。…

通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务...

我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓“stateful applications”真正具体的一个实现&#xff08;个人认为&#xff09;&#xff0c;上一章讲到有状态服务可能很多同学看到后的第一反应是“不就是个分布式缓存吗”。那今天就讲讲Actor,看看这个东西…

想转行人工智能?哈佛博士后有话说!

从17年开始&#xff0c;各大高校的数据科学与大数据技术专业持续火爆&#xff0c;2018年&#xff0c;北京大学、西安交通大学等高校更在本科阶段设立人工智能一级学科&#xff0c;中国顶尖人才的流向在悄然改变……据目前最新的数据显示&#xff0c;AI行业开发人员的月薪基本上…