7

我一直在谷歌上搜索一下,但找不到明确的答案,所以我希望有人对 Windows VS linux 中的共享内存段有所了解。

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

在 Windows 中,似乎只相当于内存映射文件,您必须在某个地方浮动一个实际文件。

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

4

3 回答 3

5

Unix mmap()API 实际上等同于CreateFileMapping/ MapViewOfFileWindows API。两者都可以映射文件和/或可以创建由交换设备(如果有)支持的共享(匿名)映射。事实上,当请求的内存大小足够大时,glibc 使用匿名mmap()来实现。malloc()

Windows 支持另一种机制 - 可执行文件中的共享数据部分,这在 Linux 中没有实现。首先,您使用 来创建一个命名数据部分#pragma data_seg(".somename"),并将共享变量放入其中。然后,您告诉链接器使用以下选项将该部分标记为读/写/共享:/SECTION:.somename,RWS. 整个过程在MSDN中有描述。这仅适用于相同模块的副本,无论是 EXE 还是 DLL 文件。相同的模块意味着相同文件系统位置中的相同文件:从相同可执行文件的不同副本创建但位于不同位置的进程不会将彼此命名的部分视为共享。

于 2013-05-27T10:35:57.880 回答
1

Yes, you can use non file-based shared memory segments in Windows.

#pragma comment(linker, "/SECTION:.shared,RWS")
#pragma data_seg(".shared")
int g_iShared = 0;
#pragma data_seg()
于 2016-08-19T09:11:47.620 回答
0

这可能有点晚了。

  1. Windows 共享内存与 Linux 不同,只有一些相似之处。

最大的区别是内存分配粒度大小。Linux 是 4K 而Windows 是 64K。如果将任意 8K 页面映射到特定的 8K 目的地很重要,那么您将被困在 Windows 上并且无法完成。(如果有人知道这一点,请告诉我)。

另一个区别是您可以在现有页面的顶部映射新页面,从而有效地替换第一页映射。在 Windows 中,您不能这样做,而是必须销毁整个视图并以所需的任何新布局重建整个视图。因此,如果“视图”包含 1024 个页面和 1 个页面更改,那么在 Linux 中您只需更改该页面即可。在 Windows 中,您必须删除所有 1024 页并重新查看相同的 1023 页 + 一个新页面!

  1. 在 Linux 上,您可以使用 ANONYMOUS 内存来共享内存而无需支持文件,但随后它变得难以共享,或者您可以使用 shm_opn 创建共享内存文件描述符并将其传递给 mmap。这是一个很好的链接。

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

我已经使用过它并且它有效。

于 2018-05-10T02:33:27.887 回答