windows共享内存

网友投稿 827 2022-05-29

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

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

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

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

windows共享内存

共享内存是一种实现多进程之间快速通信的机制。在较高的.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两个参数不同。

windows

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python共享内存
下一篇:【云小课】基础服务第42课 网络知识一箩筐——揭开IP地址的神秘身份
相关文章