Linux中的mmap文件支持映射与匿名映射[关闭]

Posted

技术标签:

【中文标题】Linux中的mmap文件支持映射与匿名映射[关闭]【英文标题】:mmap File-backed mapping vs Anonymous mapping in Linux [closed] 【发布时间】:2017-01-08 04:20:10 【问题描述】: 文件支持的映射和匿名之间的主要区别是什么 映射。 我们如何在文件支持的映射或匿名之间进行选择 映射,当我们需要进程之间的 IPC 时。 使用这些有什么优点,缺点是什么?

【问题讨论】:

【参考方案1】:

mmap() 系统调用允许您进行文件支持映射或匿名映射。

void *mmap(void *addr, size_t lengthint " prot ", int " flags ,int fd, off_t 偏移)

文件支持的映射- 在 linux 中,存在一个文件 /dev/zero,它是 0 字节的无限源。您只需打开此文件,并将其描述符传递给带有适当标志的 mmap() 调用,即 MAP_SHARED 如果您希望其他进程共享内存或MAP_PRIVATE,如果您不想分享。

前-

     .
     .
if ((fd = open("/dev/zero", O_RDWR)) < 0)
printf("open error");
if ((area = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0)) == MAP_FAILED)
  
      printf("Error in memory mapping");
      exit(1);
  
close(fd); //close the file because memory is mapped
  //create child process 
    .
    .

引用 mmap() 的手册页:-

文件映射的内容(与匿名映射相反; 请参阅下面的 MAP_ANONYMOUS),使用长度字节开始初始化 在文件引用的文件(或其他对象)中的偏移处 描述符 fd。偏移量必须是返回的页面大小的倍数 通过 sysconf(_SC_PAGE_SIZE)。

在我们的例子中,它已经用零(0)初始化。

引用 W. Richard Stevens,Stephen A. Rago II 版 UNIX 环境中的高级编程一书中的文字

以我们展示的方式使用 /dev/zero 的优点是 在我们调用 mmap 来创建 映射区域。映射 /dev/zero 会自动创建一个映射区域 指定大小的。这种技术的缺点是它 仅在相关进程之间起作用。然而,通过相关流程, 使用线程可能更简单、更有效(第 11 章) 和 12)。请注意,无论使用哪种技术,我们仍然 需要同步访问共享数据

mmap() 的调用成功后,我们创建一个子进程,它将能够看到对映射区域的写入(正如我们指定的MAP_SHARED 标志)。

匿名映射 - 我们上面所做的类似事情可以使用匿名映射来完成。对于匿名映射,我们将MAP_ANON 标志指定给mmap,并将文件描述符指定为-1。 结果区域是匿名的(因为它没有通过文件描述符与路径名关联)并创建一个可以与后代进程共享的内存区域。 优点是我们不需要任何文件来映射内存,也避免了打开和关闭文件的开销。

if ((area = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
   printf("Error in anonymous memory mapping");

因此,这些文件支持的映射和匿名映射必然只适用于相关进程。

如果您需要在不相关的进程之间这样做,那么您可能需要使用shm_open() 创建命名共享内存,然后您可以将返回的文件描述符传递给mmap()

【讨论】:

您说“这些文件支持的映射和匿名映射必须仅适用于相关进程。”为什么我们需要文件映射的 mmap。与匿名映射相比,它有何帮助。 当你进行文件支持的映射时,进程的虚拟地址空间被映射到文件。因此,当您访问该内存时,您将读取已映射到该区域的文件。然而,匿名映射映射了一个没有任何文件支持的进程虚拟内存区域。内容初始化为零。在这方面,匿名映射类似于 malloc,并在某些 malloc(3) 实现中用于某些分配。 当你 mmap() 使用 /dev/zero 时,它就像你使用匿名映射一样。 en.wikipedia.org/wiki/Mmap 很好地解释了这两者。阅读内存可见性部分以获取详细信息。它简短而准确。 谢谢。我知道在文件支持的映射中,进程的虚拟地址空间被映射到文件。但它有什么帮助。为什么我们不能只使用匿名。为什么我们需要文件支持的映射?

以上是关于Linux中的mmap文件支持映射与匿名映射[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

linux内核源码分析之虚拟内存映射

【深入浅出Linux】关于mmap的解析

C内存共享进程通信范例

mmap()共享内存详解

linux共享内存和mmap的区别

mmap/munmap映射函数在windows下是啥?如何修改