我一直在谷歌上搜索一下这个并没有找到一个明确的答案,所以我希望有人能够深入了解Windows VS linux中的共享内存段。
在Linux中,有两种为IPC创建共享内存的方法:共享内存段(shmget等)和内存映射文件(mmap)。根据我的简要理解,mmap要求您在操作系统中的某个位置有一个实际文件来映射,而共享内存段只是内存中可通过进程附加的基于名称的段。
在Windows中,似乎只有内存映射文件的等价物,你必须在某个地方浮动一个实际的文件。
我的问题:这实际上是Windows中唯一的共享内存类型,还是有用于创建基于非文件的共享内存段的api。
答案 0 :(得分:3)
Unix mmap()
API实际上等同于CreateFileMapping
/ MapViewOfFile
Windows API。两者都可以映射文件和/或可以创建由交换设备支持的共享(匿名)映射(如果有)。事实上,当请求的内存大小足够大时,glibc使用匿名mmap()
来实现malloc()
。
Windows支持一种额外的机制 - 可执行文件中的共享数据部分,这是Linux中未实现的。首先,使用#pragma data_seg(".somename")
创建一个命名数据部分,并将共享变量放入其中。然后,您告诉链接器使用以下选项将该节标记为读/写/共享:/SECTION:.somename,RWS
。整个过程在MSDN中描述。这仅适用于相同模块(EXE或DLL文件)的副本。相同的模块在同一文件系统位置中表示相同的文件:从同一可执行文件的不同副本创建但位于不同位置的进程不会将彼此命名的部分视为共享。
答案 1 :(得分:0)
您可以在此处参考此链接: http://comsci.liu.edu/~murali/win32/SharedMemory.htm
如果要创建基于非文件的共享内存段,则需要在使用CreateFileMapping()时输入0xFFFFFFF作为参数。本教程中对此进行了详细解释,并附有示例。
答案 2 :(得分:0)
是的,您可以在Windows中使用非基于文件的共享内存段。
以下是详细信息: https://blogs.msdn.microsoft.com/oldnewthing/20040804-00/?p=38253
#pragma comment(linker, "/SECTION:.shared,RWS")
#pragma data_seg(".shared")
int g_iShared = 0;
#pragma data_seg()
答案 3 :(得分:0)
这可能有点晚了。
1)Windows共享内存与Linux不同,只有一些东西是相似的。
最大的区别是内存粒度大小。 Linux是4K,Windows是64K。如果说任意8K页面映射到特定的8K目的地很重要,那么你就会被困在Windows上而且它无法完成。 (如果有人想出来的话请告诉我。)
另一个区别是您可以在现有页面的顶部mmap一个新页面,从而有效地替换第一页面映射。在Windows中,您不能这样做,而是必须销毁整个视图并在所需的新布局中重建整个视图。因此,如果“视图”包含1024个页面和1个页面更改,那么在Linux中您只需更改该页面即可。在Windows中,您必须删除所有1024页并重新查看相同的1023页+一页新页!
2)在Linux上,您可以使用ANONYMOUS内存共享没有后备文件的内存,但后来很难共享,或者您可以使用shm_opn创建共享内存文件描述符并将其传递给mmap。这是一个很好的链接。
http://nullprogram.com/blog/2016/04/10/
我已经使用了它并且它有效。