首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows共享内存段

Windows共享内存段
EN

Stack Overflow用户
提问于 2013-05-25 00:22:47
回答 3查看 5.9K关注 0票数 7

我在谷歌上搜索了一下,还没能找到一个明确的答案,所以我希望有人能对windows和linux的共享内存段有一些了解。

在Linux中,有两种为IPC创建共享内存的方法:共享内存段(shmget等人)和内存映射文件(mmap)。根据我的简要理解,mmap要求您在操作系统中的某个地方有一个实际的文件来映射,而共享内存段只是内存中可以由进程附加的基于名称的段。

在Windows中,似乎只有内存映射文件的等价物,在那里你必须有一个实际的文件在某个地方浮动。

我的问题是:这实际上是Windows中唯一一种共享内存,还是它有一个用于创建非基于文件的共享内存段的api。

EN

回答 3

Stack Overflow用户

发布于 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文件。相同模块意味着相同文件系统位置中的相同文件:从相同可执行文件的不同副本创建但位于不同位置的进程不会将彼此的命名部分视为共享。

票数 5
EN

Stack Overflow用户

发布于 2016-08-19 17:11:48

可以,您可以在Windows中使用非基于文件的共享内存段。

代码语言:javascript
复制
#pragma comment(linker, "/SECTION:.shared,RWS")
#pragma data_seg(".shared")
int g_iShared = 0;
#pragma data_seg()
票数 1
EN

Stack Overflow用户

发布于 2018-05-10 10:33:28

这可能有点晚了。

  1. Windows共享内存与Linux不同,只是有些东西相似。

最大的区别是内存分配粒度大小。Linux是4K和Windows is 64K。如果将任意的8K页面映射到特定的8K目的地是很重要的,那么你就被困在Windows上了,这是不可能做到的。(如果有人发现了这个问题,请让我知道)。

另一个不同之处在于,您可以将新页面映射到现有页面的顶部,从而有效地替换第一个页面映射。在windows中,你不能这样做,相反,你必须销毁整个视图,并以任何需要的新布局重新构建整个视图。因此,如果"view“包含1024个页面,并且1个页面发生了更改,那么在Linux中,您只需更改这一个页面即可。在Windows中,您必须丢弃所有1024个页面,并重新查看相同的1023个页面+一个新页面!

  1. 在Linux上,您可以使用匿名内存在没有备份文件的情况下共享内存,但是这样就很难共享了,或者您可以使用shm_opn创建一个共享内存文件描述符,并将其传递给mmap。这是一个很好的链接。

http://nullprogram.com/blog/2016/04/10/

我已经用过了,并且它起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16739533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档