windows共享内存

举报
风中的叶子 发表于 2019/12/25 16:59:56 2019/12/25
【摘要】 windows共享内存

https://docs.microsoft.com/zh-cn/dotnet/standard/io/memory-mapped-files

windows多进程之间通信并没有维护通用的消息队列,只有在窗口类进程中维护有窗口消息队列。即一个窗口进程中可以通过postmessage发送消息,通过DC句柄接收处理消息。 要实现普通多进程之间数据通信,可以使用管道、共享内存、文件读写、数据库读写几种方法,前两种是windows提供的机制,后两种是变通的方法。相对前两种方法因为是内存处理,效率高。 如果对实时性要求比较高,建议采用前两种方法;如果处理频率较低,本身进程中已有数据库读写的处理,也可以采用数据库读写的方式;如果数据简单,读写频率有低,有不愿专门增加数据库读写的额外处理,也可以通过文件读写的方式获取数据。

前两种因为存储在内存中,数据保密性较高;存储在数据库,如果有访问密码控制,保密性也能得到保证;存储在文件,保密性和安全性最低。

这几种方式都需要额外考虑数据读写的同步问题,采用数据库时由于数据库本身有读写锁,一般不需要考虑数据的读写冲突,只需要考虑数据业务逻辑的前后关系即可;采用文件时一定要注意读写冲突,因为文件本身涉及IO操作,相对速度较慢,很容易发生冲突导致业务异常;采用管道和共享内存时也要注意读写同步,本身管道和共享内存在操作系统内部也相当于一个特殊的文件在管理。

共享内存是一种实现多进程之间快速通信的机制。在较高的.net版本,可以直接采用MemoryMappedFile类的CreateOrOpen方法创建或者打开一个内存映射文件,然后再CreateViewAccessor指向访问视图,后面就可以对映射到本进程空间的内存进行操作了。当然,这些内是非托管的。

在早期版本,需要加载Kernel32.dll库的CreateFileMapping/OpenFileMapping/MapViewOfFile/UnmapViewOfFile函数接口来进行操作,先通过CreateFileMapping创建一个新的或者OpenFileMapping打开一个已经存在的,然后MapViewOfFile映射到本进程内存空间,然后就可以进行内存操作了,最后退出前UnmapViewOfFile取消映射。

注意着几个方法的参数:

int PAGE_READWRITE = 0x04;int FILE_MAP_ALL_ACCESS = 0xF001F;
 
CreateFileMapping(hFile, IntPtr.Zero, PAGE_READWRITE, 0, MAX_MEM_MAP_SIZE, mapFileName);
 
OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, "Global\\my_mapfile_test");
 
MapViewOfFile(mapFilehandle, 0xf001f, 0, 0, 0);
 
注意:flProtect和dwDesiredAccess两个参数不同。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。