我在谷歌上搜索了一下,还没能找到一个明确的答案,所以我希望有人能对windows和linux的共享内存段有一些了解。
在Linux中,有两种为IPC创建共享内存的方法:共享内存段(shmget等人)和内存映射文件(mmap)。根据我的简要理解,mmap要求您在操作系统中的某个地方有一个实际的文件来映射,而共享内存段只是内存中可以由进程附加的基于名称的段。
在Windows中,似乎只有内存映射文件的等价物,在那里你必须有一个实际的文件在某个地方浮动。
我的问题是:这实际上是Windows中唯一一种共享内存,还是它有一个用于创建非基于文件的共享内存段的api。
发布于 2013-05-27 18:35:58
Unix Windows实际上等同于CreateFileMapping/MapViewOfFile mmap() API。两者都可以映射文件和/或可以创建由交换设备(如果有的话)支持的共享(匿名)映射。事实上,当请求的内存足够大时,glibc使用匿名mmap()来实现malloc()。
Windows支持一种额外的机制-可执行文件中的共享数据部分,这是Linux中没有实现的。首先,使用#pragma data_seg(".somename")创建一个命名的数据节,并将共享变量放入其中。然后,使用以下选项告诉链接器将该部分标记为读/写/共享:/SECTION:.somename,RWS。整个过程用MSDN描述。这只适用于同一模块的副本,无论是EXE文件还是DLL文件。相同模块意味着相同文件系统位置中的相同文件:从相同可执行文件的不同副本创建但位于不同位置的进程不会将彼此的命名部分视为共享。
发布于 2016-08-19 17:11:48
可以,您可以在Windows中使用非基于文件的共享内存段。
#pragma comment(linker, "/SECTION:.shared,RWS")
#pragma data_seg(".shared")
int g_iShared = 0;
#pragma data_seg()发布于 2018-05-10 10:33:28
这可能有点晚了。
最大的区别是内存分配粒度大小。Linux是4K和Windows is 64K。如果将任意的8K页面映射到特定的8K目的地是很重要的,那么你就被困在Windows上了,这是不可能做到的。(如果有人发现了这个问题,请让我知道)。
另一个不同之处在于,您可以将新页面映射到现有页面的顶部,从而有效地替换第一个页面映射。在windows中,你不能这样做,相反,你必须销毁整个视图,并以任何需要的新布局重新构建整个视图。因此,如果"view“包含1024个页面,并且1个页面发生了更改,那么在Linux中,您只需更改这一个页面即可。在Windows中,您必须丢弃所有1024个页面,并重新查看相同的1023个页面+一个新页面!
http://nullprogram.com/blog/2016/04/10/
我已经用过了,并且它起作用了。
https://stackoverflow.com/questions/16739533
复制相似问题