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

【问题讨论】:

    标签: linux process ipc mmap


    【解决方案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 很好地解释了这两者。阅读内存可见性部分以获取详细信息。它简短而准确。
    • 谢谢。我知道在文件支持的映射中,进程的虚拟地址空间被映射到文件。但它有什么帮助。为什么我们不能只使用匿名。为什么我们需要文件支持的映射?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2021-09-17
    • 2017-09-02
    相关资源
    最近更新 更多